home *** CD-ROM | disk | FTP | other *** search
/ Aminet 28 / Aminet 28 (1998)(GTI - Schatztruhe)[!][Dec 1998].iso / Aminet / dev / debug / HRTmon.lha / src / HRTmonV2.s < prev    next >
Encoding:
Text File  |  1998-10-09  |  220.7 KB  |  12,092 lines

  1.  
  2. ;HRTmon Amiga system monitor
  3. ;Copyright (C) 1991-1998 Alain Malek Alain.Malek@cryogen.com
  4. ;
  5. ;This program is free software; you can redistribute it and/or
  6. ;modify it under the terms of the GNU General Public License
  7. ;as published by the Free Software Foundation; either version 2
  8. ;of the License, or (at your option) any later version.
  9. ;
  10. ;This program is distributed in the hope that it will be useful,
  11. ;but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. ;GNU General Public License for more details.
  14. ;
  15. ;You can find the full GNU GPL online at: http://www.gnu.org
  16.  
  17.  
  18. *******************************
  19. **        HRTmon v2.22       **
  20. *******************************
  21. **   code by Alain Malek    ***
  22. *******************************
  23.  
  24. version    macro
  25.     dc.b "2.22"
  26.     endm
  27.  
  28. ***********************************************************
  29.  
  30.     IFD BARFLY
  31. WHDLOAD
  32.         MC68030
  33.         SUPER            ;disable supervisor warnings
  34.         BOPT w4-        ;disable 64k warnings
  35.         OUTPUT "hrtmon.data"
  36.  
  37. OPT_OFF        MACRO
  38.         BOPT OD6-        ;disable branch optimizing
  39.         ENDM
  40. OPT_ON        MACRO
  41.         BOPT OD6+        ;enable branch optimizing
  42.         ENDM
  43.  
  44.     ENDC
  45.  
  46.     IFD _PHXASS_
  47.         MC68030
  48.         OPT NBL
  49.  
  50. OPT_OFF        MACRO
  51.         OPT 0
  52.         ENDM
  53. OPT_ON        MACRO
  54.         OPT NBL
  55.         ENDM
  56.  
  57.     ENDC
  58.  
  59.     IFND BARFLY
  60.     IFND _PHXASS_
  61.  
  62. MC68000    MACRO
  63.     ENDM
  64. MC68030    MACRO
  65.     ENDM
  66. MC68040    MACRO
  67.     ENDM
  68.  
  69. OPT_ON    MACRO
  70.     ENDM
  71. OPT_OFF    MACRO
  72.     ENDM
  73.  
  74.     ENDC
  75.     ENDC
  76.  
  77. ***********************************************************
  78.  
  79.  
  80. SC_STEP equ 16        ;fast scrolling step
  81.  
  82. PICSIZE equ $9800    ;size of mem used for bitmap ( > MAX_SCREEN*h*80 )
  83.  
  84. MAX_SCREEN equ 52
  85.  
  86.  
  87.     incdir include:
  88.     include exec/tasks.i
  89.     include hardware/custom.i
  90.  
  91. ***********************************************************
  92.  
  93.     include exec/types.i
  94.     include exec/execbase.i
  95.     include devices/hardblocks.i
  96.  
  97.     incdir hrt:
  98.  
  99. ***********************************************************
  100. ;-------------- MACRO same as reloc_pic subroutine --------
  101.  
  102. RELOC_PIC:    macro
  103.         cmp.l    #$40000,a4
  104.         bcs.b    .low\1
  105. ;-------------- bitmap needs to be in $20000 ---------
  106.         cmp.l    #$20000,pic_ptr
  107.         beq.b    .ok_corr\1
  108.         bra.b    .doreloc\1
  109.  
  110. ;-------------- bitmap needs to be in $60000 ---------
  111. .low\1        cmp.l    #$60000,pic_ptr
  112.         beq.b    .ok_corr\1
  113. .doreloc\1    jsr    reloc_pic
  114. .ok_corr\1
  115.         endm
  116.  
  117. ***********************************************************
  118.  
  119. start        ;bra.w    monitor
  120.         moveq    #0,d0
  121.         rts
  122.         dc.b "HRT!"        ;4
  123.  
  124.     OPT_OFF
  125.         bra.w    mon_install    ;8  jmp to install routine
  126.         bra.w    monitor        ;12 jmp to monitor
  127.         bra.w    mon_remove    ;16 jmp to remove routine
  128.     OPT_ON
  129. mon_size    dc.l 0            ;20 size of HRTmon (for FreeMem)
  130. color0        dc.w 0            ;24 color0
  131. color1        dc.w $eee        ;26 color1
  132. config_RM    dc.b 0            ;28 -1=right-mouse enter on 0=off
  133. config2        dc.b 0            ;29 no of keyboard to use
  134. config_key    dc.b 0            ;30 -1= \ key enter on 0=off
  135. config_IDE    dc.b 0            ;31 -1= IDE harddisk
  136. config_A1200    dc.b 0            ;32 -1= A1200
  137. config_AGA    dc.b 0            ;33 -1= AGA
  138. config_insert    dc.b 0            ;34 -1= insert
  139. config_delay    dc.b 15            ;35 repeat key delay (default = 15)
  140. config_lview    dc.b 0            ;36 -1= lview task
  141. config_elsat    dc.b 0            ;37 -1=elsat.device IDE (CD32)
  142. config_screen    dc.b 0            ;38 screen mode no 0=PAL,1=NTSC,2=MULTISCAN
  143. config_novbr    dc.b 0            ;39 0=move vbr, -1=don't move vbr
  144. entered        dc.b 0            ;40 bit 0 set if in HRTmon
  145. align        dc.b 0            ;41
  146. error_sr    dc.w 0            ;42 error sr
  147. error_pc    dc.l 0            ;44 error pc
  148. error_status    dc.w 0            ;48 error status
  149.         even
  150.  
  151.  
  152. mon_remove    movem.l    d1-a6,-(a7)
  153.         move.l    $4.w,a6
  154.         lea.l    .super(pc),a5
  155.         jsr    -30(a6)
  156.  
  157.         move.l    mon_size(pc),d0
  158.         beq.b    .nofree
  159.         lea.l    start(pc),a1
  160.         jsr    -210(a6)    ;FreeMem
  161. .nofree
  162.         tst.b    config_lview
  163.         beq.b    .nolview
  164.         move.l    $4.w,a6
  165.         move.l    gfxbase(pc),a1
  166.         jsr    -414(a6)
  167.  
  168.         lea.l    tc_block(pc),a1
  169.         jsr    -288(a6)    ;RemTask
  170.  
  171. .nolview
  172.         movem.l    (a7)+,d1-a6
  173.         moveq    #0,d0
  174.         rts
  175.  
  176. .super
  177.         sub.l    a4,a4
  178.         tst.w    proc_type
  179.         beq.b    .go68000
  180.         movec    vbr,a4
  181. .go68000
  182.         move.l    a4,a3
  183.  
  184.         lea.l    backup_vbr,a0
  185.         move.w    #$400/4-1,d0
  186. .loop        move.l    (a4),a1
  187.         cmp.l    #start,a1    ;check if vector points in HRTmon
  188.         bcs.b    .norestore
  189.         cmp.l    #end,a1
  190.         bcc.b    .norestore
  191.         move.l    (a0),(a4)
  192. .norestore    addq.l    #4,a0
  193.         addq.l    #4,a4
  194.         dbf    d0,.loop
  195.  
  196.         cmp.l    #new_except,a3
  197.         bne.b    .novbr
  198.         move.l    old_vbr(pc),a3
  199.         movec    a3,vbr
  200. .novbr
  201.         rte
  202.  
  203.  
  204. mon_install    movem.l    d1-a6,-(a7)
  205.  
  206.         lea.l    start(pc),a0
  207.  
  208.         move.w    #28,screen_height
  209.         cmp.b    #1,config_screen
  210.         bne.b    .nontsc
  211.         move.w    #22,screen_height
  212. .nontsc        cmp.b    #2,config_screen
  213.         bne.b    .nomulti
  214.         move.w    #52,screen_height
  215. .nomulti
  216.  
  217.         move.w    #MAX_SCREEN,d2
  218.         sub.w    screen_height,d2
  219.         mulu    #80,d2
  220.         move.l    d2,d1
  221.         add.l    #ascII_page1,d1
  222.         move.l    d1,ascII_ptr
  223.         move.l    d1,ascII_ptr+4
  224.         move.l    d2,d1
  225.         add.l    #ascII_page2,d1
  226.         move.l    d1,ascII_ptr+8
  227.         move.l    d2,d1
  228.         add.l    #ascII_Tracer,d1
  229.         move.l    d1,ascII_ptr+12
  230.  
  231.         move.w    screen_height,d1
  232.         subq.w    #4,d1
  233.         move.w    d1,window_bot
  234.  
  235.         move.l    a0,location
  236.         move.l    a0,location2
  237.  
  238.         move.l    $4.w,a6
  239.         move.l    MaxLocMem(a6),max_chip
  240.  
  241.         tst.b    config_IDE
  242.         beq.w    .noide
  243.  
  244.         tst.b    config_elsat
  245.         beq.b    .noelsat
  246.  
  247.         move.l    #$eb8000,ide_base
  248.         clr.l    ide_irq
  249.         move.w    #$0,ide_data
  250.         move.w    #$100,ide_error
  251.         move.w    #$100,ide_feature
  252.         move.w    #$200,ide_secnt
  253.         move.w    #$300,ide_secnb
  254.         move.w    #$400,ide_cyllo
  255.         move.w    #$500,ide_cylhi
  256.         move.w    #$600,ide_dhead
  257.         move.w    #$700,ide_status
  258.         move.w    #$700,ide_command
  259.         move.w    #$4600,ide_altstat
  260.         bra.w    .noide
  261.  
  262. .noelsat    move.w    #$0,ide_data
  263.         move.w    #$4,ide_error
  264.         move.w    #$4,ide_feature
  265.         move.w    #$8,ide_secnt
  266.         move.w    #$c,ide_secnb
  267.         move.w    #$10,ide_cyllo
  268.         move.w    #$14,ide_cylhi
  269.         move.w    #$18,ide_dhead
  270.         move.w    #$1c,ide_status
  271.         move.w    #$1c,ide_command
  272.         move.w    #$1c,ide_altstat
  273.  
  274.         move.l    #$da2000,ide_base
  275.         move.l    #$da9000,ide_irq
  276.         tst.b    config_A1200        ;A1200 ?
  277.         bne.b    .noide
  278.         move.l    #$dd2020,ide_base
  279.         move.l    #$dd3020,ide_irq
  280. .noide
  281.         move.b    config_insert(pc),insert_mode
  282.  
  283.         moveq    #0,d0
  284.         move.b    config2,d0        ;keyboard map
  285.         mulu    #12,d0
  286.         movem.l    .map(pc,d0.l),d0-d2
  287.         movem.l    d0-d2,board_ptr
  288.  
  289.         tst.b    config_lview
  290.         beq.b    .nolview
  291.         lea.l    gfxname(pc),a1
  292.         moveq    #0,d0
  293.         move.l    $4.w,a6
  294.         jsr    -552(a6)
  295.         move.l    d0,gfxbase
  296.  
  297.         move.l    #lview_name,tc_block+LN_NAME
  298.         move.b    #NT_TASK,tc_block+LN_TYPE
  299.         move.b    #8,tc_block+LN_PRI
  300.         move.l    #task_stackend,tc_block+TC_SPREG
  301.         move.l    #task_stack,tc_block+TC_SPLOWER
  302.         move.l    #task_stackend,tc_block+TC_SPUPPER
  303.  
  304.         lea.l    tc_block(pc),a1
  305.         lea.l    task_code(pc),a2
  306.         sub.l    a3,a3
  307.         jsr    -282(a6)        ;AddTask
  308.  
  309. .nolview
  310.         lea.l    .super(pc),a5
  311.         jsr    -30(a6)
  312.  
  313.         movem.l    (a7)+,d1-a6
  314.         moveq    #0,d0
  315.         rts
  316.  
  317.         cnop 0,4
  318.  
  319. .map        dc.l board3, board4, board4a
  320.         dc.l board1, board2, board2a
  321.         dc.l board5, board6, board6a
  322.         dc.l board7, board8, board8a
  323.  
  324.  
  325. .super        bsr    test_CPU
  326.         sub.l    a4,a4
  327.         move.w    d0,proc_type
  328.         beq.b    .no_vbr
  329.         movec    vbr,a4
  330. .no_vbr        move.l    a4,old_vbr
  331.         move.l    a4,a0
  332.         lea.l    backup_vbr,a1
  333.         move.w    #$400/4-1,d0
  334. .copy        move.l    (a0)+,(a1)+    ;backup vector table
  335.         dbf    d0,.copy
  336.  
  337.         tst.b    config_novbr    ;user doesn't want to move vbr ?
  338.         bne.b    .no_vbr_move
  339.         move.l    a4,d0
  340.         bne.b    .no_vbr_move    ;vbr already moved ?
  341.         tst.w    proc_type
  342.         beq.b    .no_vbr_move    ;can't move vbr (68000) ?
  343.  
  344. ;move vbr
  345.         lea.l    backup_vbr,a0
  346.         lea.l    new_except,a1
  347.         move.l    a1,a4
  348.         move.w    #$400/4-1,d0
  349. .copy2        move.l    (a0)+,(a1)+
  350.         dbf    d0,.copy2
  351.         movec    a4,vbr
  352.  
  353. .no_vbr_move
  354.         move.l    #monitor,$7c(a4)
  355.  
  356.         tst.b    config_RM
  357.         bne.b    .okRM
  358.         tst.b    config_key
  359.         beq.b    .no_entry
  360. .okRM
  361.         lea.l    $60(a4),a4
  362.         moveq    #0,d1
  363.         lea.l    except_entry(pc),a1
  364.         tst.w    proc_type
  365.         bne.b    .go10plus
  366.         moveq    #4,d1
  367.         lea.l    except_entry0(pc),a1
  368. .go10plus    moveq    #7-1,d0
  369. .loop        move.l    a1,(a4)+
  370.         add.l    d1,a1
  371.         dbf    d0,.loop
  372.  
  373. .no_entry
  374.         rte
  375.  
  376.  
  377.  
  378.         cnop    0,4
  379. gfxbase        dc.l 0
  380. wbview        dc.l 0
  381. signal_no    dc.l 0
  382. changed_disk    dcb.l 16,0
  383. gfxname        dc.b "graphics.library",0
  384. ;dosname        dc.b "dos.library",0
  385. lview_name    dc.b "HRTmon system task",0
  386.  
  387.         cnop    0,4
  388. tc_block    dcb.b TC_SIZE,0
  389. task_stack    dcb.b $400,0
  390. task_stackend
  391.  
  392. task_code
  393.         move.l    $4.w,a6
  394.         moveq    #-1,d0
  395.         jsr    -330(a6)        ; AllocSignal
  396.         move.l    d0,signal_no
  397.  
  398. .loop        move.l    signal_no(pc),d0
  399.         move.l    $4.w,a6
  400.         jsr    -318(a6)        ; Wait
  401.  
  402.         move.l    gfxbase(pc),a6
  403.  
  404.         move.l    wbview(pc),a1
  405.         jsr    -222(a6)         ; LoadView Fix view
  406.         move.l    38(a6),$dff080        ; Kick it into life
  407.  
  408.  
  409.     bra.b    .loop
  410.  
  411. ;experimental code removed should be done from a PROCESS
  412.  
  413. ;        move.l    $4.w,a6
  414. ;        lea.l    dosname(pc),a1
  415. ;        moveq    #0,d0
  416. ;        jsr    -552(a6)
  417. ;        tst.l    d0
  418. ;        beq.b    .nodos
  419. ;        move.l    d0,a6
  420. ;
  421. ;        lea.l    changed_disk(pc),a4
  422. ;        moveq    #16-1,d7
  423. ;.next        move.l    (a4)+,d0
  424. ;        beq.b    .empty
  425. ;
  426. ;        move.l    d0,a0
  427. ;        lea.l    part_name2(a0),a0
  428. ;        moveq    #0,d0
  429. ;        lea.l    .tmp_name(pc),a1
  430. ;        move.b    (a0)+,d0
  431. ;.copy        move.b    (a0)+,(a1)+
  432. ;        dbf    d0,.copy
  433. ;        move.b    #':',(a1)+
  434. ;        sf    (a1)+
  435. ;
  436. ;        clr.l    -4(a4)
  437. ;
  438. ;        move.l    d7,-(a7)
  439. ;
  440. ;        move.l    #.tmp_name,d1
  441. ;        jsr    -174(a6)        ; DeviceProc
  442. ;        tst.l    d0
  443. ;        beq.b    .err
  444. ;        move.l    d0,a3
  445. ;        move.l    a3,d1
  446. ;        moveq    #$1f,d2
  447. ;        moveq    #-1,d3
  448. ;        moveq    #0,d4
  449. ;        moveq    #0,d5
  450. ;        moveq    #0,d6
  451. ;        moveq    #0,d7
  452. ;        jsr    -240(a6)        ; DoPkt
  453. ;        tst.l    d0
  454. ;        beq.b    .err
  455. ;        move.l    a3,d1
  456. ;        moveq    #$1f,d2
  457. ;        moveq    #0,d3
  458. ;        moveq    #0,d4
  459. ;        moveq    #0,d5
  460. ;        moveq    #0,d6
  461. ;        moveq    #0,d7
  462. ;        jsr    -240(a6)        ; DoPkt
  463. ;.err
  464. ;        move.l    (a7)+,d7
  465. ;
  466. ;.empty        dbf    d7,.next
  467. ;
  468. ;        move.l    a6,a1
  469. ;        move.l    $4.w,a6
  470. ;        jsr    -414(a6)
  471. ;
  472. ;.nodos
  473. ;        bra.w    .loop
  474. ;
  475. ;        rts
  476.  
  477. ;.tmp_name    dcb.b    34,0
  478.  
  479.         cnop    0,4
  480. max_chip    dc.l 0        ;maximum value for CHIP-RAM
  481. oldlev7        dc.l 0
  482. old_vbr        dc.l 0
  483.  
  484. ;-------------- interrupt routine to catch 'key' press and right-mouse
  485. ;-------------- this routine is used only on 68000
  486.  
  487. except_entry0
  488.         OPT_OFF
  489.         bsr.w    .entry
  490.         bsr.w    .entry
  491.         bsr.w    .entry
  492.         bsr.w    .entry
  493.         bsr.w    .entry
  494.         bsr.w    .entry
  495.         bsr.w    .entry
  496.         OPT_ON
  497.  
  498. .entry
  499.         tst.b    config_RM
  500.         beq.b    .noright
  501.         btst    #10-8,$dff016
  502.         bne.b    .noright
  503.         addq.l    #4,a7
  504.         bra.w    monitor
  505. .noright
  506.         tst.b    config_key
  507.         beq.b    .nokey
  508.         cmp.b    #$e5,$bfec01
  509.         bne.b    .nokey
  510.         addq.l    #4,a7
  511.         bra.w    monitor
  512. .nokey
  513.         move.w    sr,-(a7)
  514.         move.w    #$2700,sr
  515.         move.l    2(a7),.retaddr
  516.  
  517.         move.l    a0,2(a7)
  518.  
  519.         sub.l    #except_entry0+4,.retaddr
  520.         lea.l    backup_vbr,a0
  521.         add.l    .retaddr,a0
  522.         move.l    $60(a0),.jmp_addr
  523.  
  524.         move.l    2(a7),a0
  525.  
  526.         move.l    .jmp_addr(pc),2(a7)
  527.         rte
  528.  
  529.         cnop 0,4
  530. .retaddr    dc.l 0
  531. .jmp_addr    dc.l 0
  532.  
  533.  
  534. ;-------------- interrupt routine to catch 'key' press and right-mouse
  535. ;-------------- this routine is used only on 68010+
  536.  
  537. except_entry    tst.b    config_RM
  538.         beq.b    .noright
  539.         btst    #10-8,$dff016
  540.         beq.w    monitor
  541. .noright
  542.         tst.b    config_key
  543.         beq.b    .nokey
  544.         cmp.b    #$e5,$bfec01
  545.         beq.w    monitor
  546. .nokey
  547.         move.w    sr,-(a7)
  548.         move.w    #$2700,sr
  549.         move.w    (a7)+,.newsr
  550.  
  551.         movem.l    d0/a0,-(a7)
  552.  
  553.         move.w    8+6(a7),d0
  554.         and.w    #$fff,d0
  555.         lea.l    backup_vbr,a0
  556.         add.w    d0,a0
  557.         move.l    (a0),.jmp_addr
  558.  
  559.         movem.l    (a7)+,d0/a0
  560.  
  561.         clr.w    -(a7)
  562.         move.l    .jmp_addr(pc),-(a7)
  563.         move.w    .newsr(pc),-(a7)
  564.         rte
  565.  
  566.         cnop 0,4
  567. .jmp_addr    dc.l 0
  568. .newsr        dc.w 0
  569.  
  570.         cnop 0,16
  571.  
  572. location    dc.l 0            ;HRTmon location
  573.         dc.b "HRT!"
  574. new_except    dcb.l    $100,0
  575.  
  576.         dc.b "ATZ!"
  577.         dc.l monitor            ;trap vector
  578.  
  579.         dc.b "HRTmon "
  580.         version
  581.         dc.b " "
  582.         dc.b "by Alain Malek "
  583.         dc.b "(Hornet of Alcatraz) "
  584.  
  585.         cnop 0,4
  586.  
  587. pic_ptr        dc.l $20000        ;address used for the bitplan of HRTmon
  588. h=9                    ;heights between two lines
  589.  
  590. ;-------------- init. HRTmon when entered for the 1st time ----
  591.  
  592. init_code    movem.l    d0-a6,-(a7)
  593.  
  594.         move.l    #$12345678,d0
  595.         tst.w    Reset_Flag
  596.         bne.b    .init
  597.         cmp.l    inited,d0
  598.         beq.w    .noinit
  599. .init        move.l    d0,inited
  600.  
  601.         jsr    init_ascII
  602.  
  603.         jsr    test_drive    ;test which floppy drive is present
  604.  
  605.         tst.b    drive_present+1
  606.         beq.b    .noDF1
  607.         move.l    #floppy1,floppy0    ;add DF1: partition
  608. .noDF1
  609.  
  610.         move.w    proc_type,d0
  611.         add.b    #'0',d0
  612.         move.b    d0,mc_txt+5
  613.  
  614.         jsr    init_fbuffer
  615.  
  616.         tst.b    config_IDE
  617.         beq.b    .noide
  618.  
  619.         move.l    ide_irq,d0
  620.         beq.b    .noIDEirq
  621.         move.l    d0,a3
  622.         tst.b    (a3)
  623.         bpl.b    .noIDEirq
  624.         move.l    ide_base,a3
  625.         tst.b    config_A1200
  626.         bne.b    .go1200
  627.         move.w    ide_status,d0
  628.         move.b    (a3,d0.w),d0
  629.         bra.b    .noIDEirq
  630. .go1200        jsr    wait_irq        ;remove IRQ request from IDE
  631. .noIDEirq
  632.  
  633.         jsr    find_part
  634. .noide
  635.  
  636. ;set default values for some write only custom registers
  637.  
  638.         lea.l    custom,a1
  639.         move.w    #$4489,$7e(a1)
  640.         move.w    #$20,$1dc(a1)
  641.         move.w    #$3081,$8e(a1)
  642.         move.w    #$30c1,$90(a1)
  643.         move.w    #$0038,$92(a1)
  644.         move.w    #$00d0,$94(a1)
  645.         move.w    #0,$108(a1)
  646.         move.w    #0,$10a(a1)
  647.         move.w    #0,$106(a1)
  648.         move.w    #0,$1fc(a1)
  649.         move.w    #$9200,$100(a1)
  650.         move.w    #0,$102(a1)
  651.  
  652.  
  653. .noinit        movem.l    (a7)+,d0-a6
  654.         rts
  655.  
  656.  
  657. ;test if exec is here and valid
  658. ;d0=0 ok, -1 = no system
  659.  
  660. exec_here    movem.l    d1/a0-a1,-(a7)
  661.  
  662.         move.l    $4.w,a0
  663.         move.l    a0,d0
  664.         lsr.l    #1,d0
  665.         bcs.b    .nosafe
  666.         lea.l    34(a0),a1
  667.         moveq    #0,d0
  668.         moveq    #$18-1,d1
  669. .add        add.w    (a1)+,d0
  670.         dbf    d1,.add
  671.         not.w    d0
  672.         cmp.w    82(a0),d0
  673.         bne.b    .nosafe
  674.  
  675.         moveq    #0,d0
  676.         bra.b    .ok
  677.  
  678. .nosafe        moveq    #-1,d0
  679. .ok        movem.l    (a7)+,d1/a0-a1
  680.         rts
  681.  
  682.         cnop 0,4
  683.  
  684. ;-------------- when in HRTmon VBR points here -----------------
  685.  
  686. HRTmon_vbr
  687.         dc.l error,error,recover,recover;$00-$0c
  688.         dc.l recover,recover,error,error;$10-$1c
  689.         dc.l error,error,error,error    ;$20-$2c
  690.         dc.l error,error,error,error    ;$30-$3c
  691.         dc.l error,error,error,error    ;$40-$4c
  692.         dc.l error,error,error,error    ;$50-$5c
  693.         dc.l error,error    ;$60,$64
  694.         dc.l error        ;$68
  695.         dc.l newirq        ;$6c        ;VBL irq
  696.         dc.l error        ;$70
  697.         dc.l error        ;$74
  698.         dc.l error        ;$78
  699.         dc.l .onlyret        ;$7c
  700.         dc.l error,error,error,error    ;$80-$8c
  701.         dc.l error,error,error,error    ;$90-$9c
  702.         dc.l error,error,error,error    ;$a0-$ac
  703.         dc.l error,error,error,error    ;$b0-$bc
  704.         dc.l error,error,error,error    ;$c0-$cc
  705.         dc.l error,error,error,error    ;$d0-$dc
  706.         dc.l error,error,error,error    ;$e0-$ec
  707.         dc.l error,error,error,error    ;$f0-$fc
  708.  
  709. .onlyret    rte
  710.  
  711. ;-------------- jmp here if an unexpected exception is raised ----------
  712. ;-------------- (should never happen !) --------------------------------
  713.  
  714. error        move.w    #$2700,sr
  715.         move.l    2(a7),error_pc
  716.         move.w    (a7),error_sr
  717.         move.w    6(a7),error_status
  718.         move.w    #0,$dff106
  719.         move.w    #$f00,$dff180        ;red flash
  720.         rte
  721.  
  722. ;-------------- jmp here if an unexpected exception is raised ----------
  723. ;-------------- will try to recover from error  ------------------------
  724.  
  725. recover        move.w    #$2700,sr
  726.         tst.b    cmd_executed
  727.         beq.b    error
  728.         move.l    a7,a0
  729.         lea.l    crash_stack,a1
  730.         move.w    #$100/2-1,d0
  731. .copy        move.w    (a0)+,(a1)+
  732.         cmp.l    #stack,a0
  733.         dbhs    d0,.copy
  734.         st    cmd_crashed
  735.         bra.w    end_command
  736.  
  737.         cnop 0,4
  738.  
  739. **************************************************************************
  740. ;-------------- Entry point of HRTmon ------------------------------------
  741.  
  742.         cnop 0,4
  743.  
  744. location2    dc.l 0            ;HRTmon location
  745.         dc.b "HRT!"
  746. monitor:    move.l    a0,-(a7)
  747.         lea.l    entered(pc),a0
  748.         bset    #0,(a0)
  749.         beq.b    .enter
  750.         move.l    (a7)+,a0
  751.         rte                ;don't enter twice
  752.  
  753. .enter
  754.         move.l    (a7)+,a0
  755.         move.w    #$2700,sr
  756.  
  757.         movem.l    d0-a7,registres
  758.  
  759.         move.l    2(a7),d0        ;get PC
  760.         cmp.l    #start,d0
  761.         bcs.b    .notin
  762.         cmp.l    #end,d0
  763.         bcc.b    .notin
  764.         move.l    registres,d0
  765.         clr.b    entered
  766.         rte
  767. .notin
  768.  
  769.         tst.w    proc_type
  770.         bne.b    .go10plus
  771.         move.l    #simple_ret,$7c.w
  772.         bra.b    .go00
  773. .go10plus    movec    vbr,a0
  774.         move.l    #simple_ret,$7c(a0)
  775.  
  776. .go00
  777.         lea.l    stack,a7        ;Own stack
  778.                         ;now bsr are allowed
  779.  
  780.         bsr    ClearCache
  781.  
  782.         tst.b    config_lview
  783.         beq.b    .nolview
  784.         bsr    exec_here
  785.         bne.b    .nolview
  786.         move.l    gfxbase(pc),a6
  787.         move.l    34(a6),d0        ;get actual view
  788.         beq.b    .nolview
  789.         move.l    d0,wbview
  790.         sub.l    a1,a1
  791.         jsr    -222(a6)        ;LoadView(NULL)
  792.         move.l    signal_no(pc),d0
  793.         lea.l    tc_block(pc),a1
  794.         move.l    $4.w,a6
  795.         jsr    -324(a6)        ;Signal
  796. .nolview
  797.  
  798.         bsr    init_code
  799.  
  800.         bsr    ClearCache
  801.  
  802.         cmp.w    #4,proc_type
  803.         blt.b    .notrans0
  804.     MC68040
  805.         movec    itt0,d0
  806.         move.l    d0,itt0_reg
  807.         movec    itt1,d0
  808.         move.l    d0,itt1_reg
  809.         movec    dtt0,d0
  810.         move.l    d0,dtt0_reg
  811.         movec    dtt1,d0
  812.         move.l    d0,dtt1_reg
  813.         movec    tc,d0
  814.         move.l    d0,tc_reg
  815.         cpusha    bc
  816.         cinva    bc
  817.         dc.w $f518        ;pflusha
  818.     MC68030
  819. .notrans0
  820.  
  821.         lea.l    $dff000,a6
  822.         move.l    $4(a6),OldRaster    ;save raster pos
  823.                         ;(wrong coz of .waittrap !)
  824.  
  825. .blit        btst    #6,($2,a6)
  826.         bne.b    .blit            ;wait end of blitter operation
  827.  
  828.         move.l    a7_reg,a0
  829.         move.w    (a0),sr_reg
  830.         move.l    2(a0),pc_reg
  831.  
  832.         btst    #5,$bfe001        ;need to wait end of DMA disk ?
  833.         bne.b    .no_drive
  834.         move.l    #$20000,d1
  835. .loop        subq.l    #1,d1
  836.         beq.b    .no_drive
  837.         move.w    $1e(a6),d0        ;wait for DMAdisk IRQ
  838.         and.w    #2,d0
  839.         beq.b    .loop
  840. .no_drive
  841.         move.l    USP,a0
  842.         move.l    a0,usp_reg
  843.         move.l    a7_reg,ssp_reg
  844.         move.w    sr_reg,d0
  845.         and.w    #$2000,d0
  846.         bne.b    ok_ssp_a7
  847.         move.l    a0,a7_reg
  848. ok_ssp_a7
  849.         clr.l    vbr_reg
  850.         cmp.w    #1,proc_type
  851.         blt.b    .novbr
  852.         movec    VBR,d0
  853.         move.l    d0,vbr_reg
  854. .novbr
  855.         cmp.w    #2,proc_type
  856.         blt.w    .no23
  857.         movec    CACR,d0
  858.         move.l    d0,cacr_reg
  859.         moveq    #0,d0
  860.         cmp.w    #6,proc_type
  861.         bne.b    .no60
  862.         move.l    #'BUSR',CAAR_txt
  863.         dc.w    $4e7a,$0008        ;movec    BUSCR,d0
  864.         bra.b    .nocaar
  865. .no60        cmp.w    #4,proc_type
  866.         bge.b    .nocaar
  867.         movec    CAAR,d0
  868. .nocaar        move.l    d0,caar_reg
  869.         move.l    ssp_reg,isp_reg
  870.         move.l    ssp_reg,d0
  871.         cmp.w    #6,proc_type        ;68060 ?
  872.         beq.b    .nomsp
  873.         movec    MSP,d0
  874.         bra.b    .okmsp
  875. .nomsp        move.l    #'PCR=',MSP_txt
  876.         dc.w    $4e7a,$0808        ;movec    PCR,d0
  877. .okmsp        move.l    d0,msp_reg
  878.  
  879.         cmp.w    #4,proc_type
  880.         bge.b    .no23
  881.         or.w    #$2111,d0        ;switch all CACHE ON
  882.         movec    d0,CACR            ;(68020/68030 only)
  883. .no23
  884.  
  885.         bsr    enter_vbr
  886.  
  887.         bsr    save_custom
  888.  
  889.         bsr    save_CIA
  890.  
  891.         move.l    #-1,trace_address
  892.  
  893. ;-------------- don't trace subroutine in tracer ? --------
  894.  
  895.         tst.b    trace_bsr
  896.         beq.b    .no_bsr
  897.         tst.w    trace_count
  898.         beq.b    .oky
  899.         clr.w    trace_count
  900.         sf    trace_bsr
  901.         bra.b    .no_bsr
  902. .oky
  903.         move.w    sr_reg,d0
  904.  
  905.         move.l    a7_reg,a0
  906.         and.w    #$2000,d0
  907.         beq.b    .no_super
  908.         addq.l    #6,a0            ;skip SR and PC
  909.  
  910.         move.w    (a0),d0            ;read stack frame no
  911.         lsr.w    #4,d0
  912.         lsr.w    #8,d0
  913.         lea.l    frame(pc),a4
  914.         add.w    (a4,d0.w*2),a0        ;add stack frame size
  915. .no_super    move.l    (a0),tracer_old_rts
  916.         move.l    #.tracer_rts,(a0)
  917.         move.l    vbr_reg,a4
  918.         move.l    #.tracer_ill,$10(a4)
  919.         sf    trace_bsr
  920.         bra.b    .out
  921. .tracer_rts    illegal
  922. .tracer_ill    move.l    tracer_old_rts,2(a7)
  923.         bra.w    monitor
  924.  
  925. .no_bsr
  926. ;-------------------------------------------
  927.  
  928.         bsr    ClearCache
  929.  
  930.         bsr.w    super            ;enter main code
  931.  
  932. .out        move.w    #$7fff,d0
  933.         move.w    d0,$9a(a6)
  934.         move.w    d0,$96(a6)
  935.         move.w    d0,$9c(a6)
  936.  
  937.         bsr    restore_CIA
  938.         bsr    restore_custom
  939.  
  940.         bsr    init_mwatch
  941.  
  942.         cmp.w    #1,proc_type
  943.         ble.b    .okmsp2
  944.         cmp.w    #6,proc_type        ;68060 ?
  945.         beq.w    .nomsp2
  946.         move.l    msp_reg,a0
  947.     MC68030
  948.         movec    a0,MSP
  949.     MC68000
  950.         bra.b    .okmsp2
  951. .nomsp2        move.l    msp_reg,a0
  952.         dc.w    $4e7b,$8808        ;movec    a0,PCR
  953. .okmsp2
  954.         move.l    usp_reg,a0
  955.         move.l    a0,USP
  956.  
  957.         move.l    ssp_reg,a7
  958.         move.w    sr_reg,(a7)
  959.  
  960.         move.l    vbr_reg,a4
  961.  
  962.         tst.w    trace_count
  963.         beq.b    trace_off
  964.         or.w    #$8000,(a7)
  965.         move.l    $24(a4),old_trace
  966.         lea.l    trace_reach(pc),a0
  967.         move.l    a0,$24(a4)
  968.  
  969. trace_off    cmp.l    #-1,trace_address
  970.         beq.b    tracea_off
  971.         or.w    #$8000,(a7)
  972.         move.l    $24(a4),old_trace
  973.         lea.l    tracea_reach(pc),a0
  974.         move.l    a0,$24(a4)
  975. tracea_off
  976.         move.l    pc_reg,2(a7)
  977.  
  978.         bsr    ClearCache
  979.         cmp.w    #6,proc_type
  980.         bne.b    .no60
  981.         move.l    caar_reg,a0
  982.         dc.w    $4e7b,$8008        ;movec a0,BUSCR
  983. .no60        cmp.w    #1,proc_type
  984.         ble.b    .nocache
  985.         cmp.w    #4,proc_type
  986.         bge.b    .nocaar2
  987.     MC68030
  988.         move.l    caar_reg,a0
  989.         movec    a0,CAAR
  990. .nocaar2    move.l    cacr_reg,d0
  991.         movec    d0,CACR            ;restore CACR
  992.     MC68000
  993. .nocache
  994.         cmp.w    #4,proc_type
  995.         blt.b    .notrans
  996.     MC68040
  997.         move.l    itt0_reg,d0
  998.         movec    d0,itt0
  999.         move.l    itt1_reg,d0
  1000.         movec    d0,itt1
  1001.         move.l    dtt0_reg,d0
  1002.         movec    d0,dtt0
  1003.         move.l    dtt1_reg,d0
  1004.         movec    d0,dtt1
  1005.         cpusha    bc
  1006.         cinva    bc
  1007.         dc.w $f518        ;pflusha
  1008.     MC68000
  1009. .notrans
  1010.  
  1011.         move.l    custom+$4,d0
  1012.         lsr.l    #1,d0
  1013.         lsr.w    #7,d0
  1014. .raster        move.l    $4(a6),d1        ;wait raster pos
  1015.         lsr.l    #1,d1            ;for exit
  1016.         lsr.w    #7,d1
  1017.         cmp.w    d0,d1
  1018. ;        bne.b    .raster
  1019.  
  1020.         tst.b    reboot
  1021.         beq.b    .noreboot
  1022.         sf    reboot
  1023.         lea.l    $48000,a0
  1024.         lea.l    start,a1
  1025.         move.l    #(end-start),d0
  1026.         lsr.l    #3,d0
  1027. .copy        move.l    (a1)+,(a0)+        ;copy HRTmon to $48000
  1028.         move.l    (a1)+,(a0)+
  1029.         dbf    d0,.copy
  1030.  
  1031. .noreboot
  1032.         tst.b    kill
  1033.         beq.b    .nokill
  1034.     MC68030
  1035.         tst.w    proc_type
  1036.         beq.b    .okkill
  1037.         move.l    old_vbr(pc),a0
  1038.         movec    a0,VBR
  1039.     MC68000
  1040.         bra.b    .okkill
  1041.  
  1042. .nokill
  1043.         bsr    exit_vbr
  1044.  
  1045. .okkill        movem.l    registres,d0-d7/a0-a6
  1046.         sf    entered
  1047.  
  1048. simple_ret    rte
  1049.  
  1050.  
  1051. *************************************************************
  1052.  
  1053. clean_vbr    movem.l    d0/a0-a1/a4,-(a7)
  1054.  
  1055. ;remove all HRTmon ptr in vector table
  1056.         move.l    vbr_reg,a4
  1057.         lea.l    backup_vbr,a0
  1058.         move.w    #$400/4-1,d0
  1059. .loop        move.l    (a4),a1
  1060.         cmp.l    #start,a1    ;check if vector points in HRTmon
  1061.         bcs.b    .norestore
  1062.         cmp.l    #end,a1
  1063.         bcc.b    .norestore
  1064.         move.l    (a0),(a4)
  1065. .norestore    addq.l    #4,a0
  1066.         addq.l    #4,a4
  1067.         dbf    d0,.loop
  1068.  
  1069. ;update vector table backup
  1070.         lea.l    backup_vbr,a1
  1071.         move.l    vbr_reg,a0
  1072.         move.w    #$400/4-1,d0
  1073. .copy        move.l    (a0)+,(a1)+
  1074.         dbf    d0,.copy
  1075.  
  1076.         movem.l    (a7)+,d0/a0-a1/a4
  1077.         rts
  1078.  
  1079. *************************************************************
  1080.  
  1081. enter_vbr    movem.l    d0-a6,-(a7)
  1082.  
  1083.         bsr    clean_vbr
  1084.  
  1085.         tst.w    proc_type
  1086.         bne.b    .no68000
  1087.  
  1088. ;        move.l    #newirq,$6c.w
  1089.  
  1090.         bra.b    .ok68000
  1091.  
  1092. .no68000    lea.l    HRTmon_vbr(pc),a0
  1093.     MC68030
  1094.         movec    a0,vbr
  1095.     MC68000
  1096.  
  1097. .ok68000    movem.l    (a7)+,d0-a6
  1098.         rts
  1099.  
  1100. *************************************************************
  1101.  
  1102. exit_vbr    tst.w    proc_type
  1103.         bne.b    .no68000
  1104.  
  1105. ;        move.l    backup_vbr+$6c,$6c.w
  1106.  
  1107.         lea.l    $60.w,a0
  1108.         lea.l    except_entry0(pc),a1
  1109.         moveq    #7-1,d0
  1110. .loop0        move.l    a1,(a0)+
  1111.         addq.l    #4,a1
  1112.         dbf    d0,.loop0
  1113.  
  1114.         bra.b    .ok68000
  1115.  
  1116. .no68000    move.l    vbr_reg,a0
  1117.     MC68030
  1118.         movec    a0,vbr
  1119.     MC68000
  1120.  
  1121.         tst.b    config_RM
  1122.         bne.b    .okRM
  1123.         tst.b    config_key
  1124.         beq.b    .ok68000
  1125. .okRM
  1126.         lea.l    $60(a0),a0
  1127.         lea.l    except_entry(pc),a1
  1128.         moveq    #7-1,d0
  1129. .loop        move.l    a1,(a0)+
  1130.         dbf    d0,.loop
  1131.  
  1132. .ok68000    move.l    vbr_reg,a0
  1133.         move.l    #monitor,$7c(a0)
  1134.         rts
  1135.  
  1136. *************************************************************
  1137.  
  1138. ;Clear instruction and data cache of 68000-68060
  1139.  
  1140. ClearCache    move.l    d0,-(a7)
  1141.         cmp.w    #1,proc_type    ;no flush for 68000 and 68010
  1142.         bls.b    .end
  1143.         cmp.w    #4,proc_type
  1144.         bge.b    .cic_040
  1145.  
  1146.     MC68030
  1147.         movec    CACR,d0
  1148.         cmp.w    #3,proc_type
  1149.         bne.b    .no30
  1150.         or.w    #$0800,d0
  1151. .no30        or.w    #$8,d0
  1152.         movec    d0,CACR
  1153.         bra.b    .end
  1154.     MC68000
  1155. .cic_040
  1156.     MC68040
  1157.         cpusha    BC
  1158.         cinva    BC
  1159.     MC68000
  1160. .end
  1161.         move.l    (a7)+,d0
  1162.         rts
  1163.  
  1164. ***********************************************************
  1165. ;test if 68020,30,40,or 60 processor
  1166.  
  1167. ;<- d0=processor type 2=68020,3=68030,4=68040,6=68060
  1168.  
  1169.     MC68030
  1170.  
  1171. test_CPU    move.w    #$2700,sr
  1172.         movem.l    d1-d2/a0/a4,-(a7)
  1173.         move.l    $10.w,d1
  1174.         move.l    #.mc00,$10.w
  1175.         movec    VBR,a0        ;68000 ?
  1176.         move.l    d1,$10.w
  1177.         move.l    a0,.old_vbr
  1178.  
  1179.         lea.l    .except,a0
  1180.         movec    a0,VBR
  1181.  
  1182.         move.l    a7,a4
  1183.  
  1184.         moveq    #1,d0
  1185.         move.b    (.dat020,pc,d0.w*2),d0    ;68010 ?
  1186.         cmp.b    #1,d0
  1187.         beq.b    .out
  1188.  
  1189.         moveq    #1,d0
  1190.         moveq    #1,d1
  1191.         moveq    #1,d2
  1192.         move.l    #.mc60,($f4,a0)    ;new unimplemented instr.
  1193.         muls.l    d0,d1:d2    ;68060 ? (not implemented on 060)
  1194.  
  1195.     MC68040
  1196.         move.l    #.mc23,($10,a0)    ;new illegal
  1197.         movec    URP,d0        ;68040 and 68060 only
  1198.     MC68030
  1199.  
  1200.         moveq    #4,d0
  1201.         bra.b    .out
  1202.  
  1203. .ret23        move.l    #.mc20,($2c,a0)    ;new F-line
  1204.         pflusha            ;030 MMU instruction
  1205.  
  1206.         moveq    #3,d0
  1207.  
  1208. .out        move.l    a4,a7
  1209.         move.l    .old_vbr,a0
  1210.         movec    a0,VBR
  1211. .out00        movem.l    (a7)+,d1-d2/a0/a4
  1212.         move.w    #$2700,sr
  1213.         rts
  1214.  
  1215. .dat020        dc.b 0,1,2,3
  1216.  
  1217. .mc00        moveq    #0,d0
  1218.         move.l    d1,$10.w
  1219.         move.l    #.out00,(2,a7)
  1220.         rte
  1221.  
  1222. .mc60        moveq    #6,d0
  1223.         move.l    #.out,(2,a7)
  1224.         rte
  1225.  
  1226. .mc23        move.l    #.ret23,(2,a7)
  1227.         rte
  1228.  
  1229. .mc20        moveq    #2,d0
  1230.         move.l    #.out,(2,a7)
  1231.         rte
  1232.  
  1233.     MC68000
  1234.  
  1235. .old_vbr    dc.l 0
  1236. .kill        rte
  1237.         cnop 0,4
  1238. .except        dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1239.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1240.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1241.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1242.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1243.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1244.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1245.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1246.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1247.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1248.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1249.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1250.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1251.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1252.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1253.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1254.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1255.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1256.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1257.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1258.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1259.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1260.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1261.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1262.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1263.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1264.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1265.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1266.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1267.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1268.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1269.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1270.  
  1271. ***********************************************************
  1272. ;-------------- save custom registers ---------------------
  1273. ;-------------- palette saving done by read_palette -------
  1274.  
  1275. save_custom    movem.l    d0/a0-a4,-(a7)
  1276.  
  1277. ;        lea.l    Action_CUST,a0
  1278.         lea.l    custom,a1
  1279.         move.l    a1,a4
  1280. ;        move.w    #$200/8-1,d0
  1281. ;.copy        move.l    (a0)+,(a1)+
  1282. ;        move.l    (a0)+,(a1)+
  1283. ;        dbf    d0,.copy
  1284.  
  1285.         move.w    $2(a6),d0
  1286.         move.w    d0,2(a4)
  1287.         or.w    #$8000,d0
  1288.         move.w    d0,$96(a4)    ;DMACON
  1289.         move.w    #$7fff,$96(a6)
  1290.         move.w    $1c(a6),d0
  1291.         move.w    d0,$1c(a4)
  1292.         or.w    #$8000,d0
  1293.         move.w    d0,$9a(a4)    ;INTENA
  1294.         move.w    #$7fff,$9a(a6)
  1295.         move.w    $1e(a6),d0
  1296.         move.w    d0,$1e(a4)
  1297.         or.w    #$8000,d0
  1298.         move.w    d0,$9c(a4)    ;INTREQ
  1299.         move.w    #$7fff,$9c(a6)
  1300.  
  1301.         move.w    $10(a6),d0
  1302.         move.w    d0,$10(a4)
  1303.         or.w    #$8000,d0
  1304.         move.w    d0,$9e(a4)    ;ADKCON
  1305.  
  1306.         move.l    OldRaster,$4(a4)    ;VPOSR,VHPOSR
  1307.  
  1308.         lea.l    $a(a6),a0
  1309.         lea.l    $a(a4),a1
  1310.         moveq    #9-1,d0
  1311. .copy1        move.w    (a0)+,(a1)+
  1312.         dbf    d0,.copy1
  1313.  
  1314.         move.w    $7c(a6),$7c(a4)        ;LISAID
  1315.         move.w    $1da(a6),$1da(a4)    ;HHPOSR
  1316.  
  1317.     ;    moveq    #0,d0
  1318.     ;    jsr    analyse_copper
  1319.  
  1320.         movem.l    (a7)+,d0/a0-a4
  1321.         rts
  1322.  
  1323. ;-------------- restore custom registers ------------------
  1324.  
  1325. restore_custom    movem.l    d0/a1,-(a7)
  1326.         lea.l    custom,a1
  1327.  
  1328.         ;move.l    $20(a1),$20(a6)        ;DISKPTR
  1329.         move.w    $7e(a1),$7e(a6)        ;DSKSYNC
  1330.         move.w    $9e(a1),$9e(a6)        ;ADKCON
  1331.         ;move.w    $34(a1),$34(a6)        ;POTGO
  1332.         move.w    $1dc(a1),$1dc(a6)    ;BEAMCON0
  1333.         ;move.w    $1e4(a1),$1e4(a6)    ;DIWHIGH
  1334.         move.l    $8e(a1),$8e(a6)        ;diwstrt/stop
  1335.         move.l    $92(a1),$92(a6)        ;ddfstrt/stop
  1336.         ;move.l    $e0(a1),$e0(a6)        ;BPL1PT
  1337.         move.w    $1fc(a1),$1fc(a6)    ;FMODE
  1338.         move.l    $108(a1),$108(a6)    ;BPL1MOD
  1339.         move.w    $106(a1),$106(a6)    ;BPLCON3
  1340.         move.l    $100(a1),$100(a6)    ;BPLCON0
  1341.         ;move.w    $10c(a1),$10c(a6)    ;BPLCON4
  1342.  
  1343.         move.w    $96(a1),$96(a6)        ;DMACON
  1344.         move.w    $9c(a1),$9c(a6)        ;INTREQ
  1345.         move.w    $9a(a1),$9a(a6)        ;INTENA
  1346.  
  1347. ;        move.l    $84(a1),d0        ;correct
  1348. ;        cmp.l    #$f28,d0        ;an AmigaOS
  1349. ;        bne.b    .nof28            ;problem
  1350. ;        tst.l    $f28.w            ;of the LoadView(NULL)
  1351. ;        bne.b    .nof28
  1352. ;        move.l    #$f24,$84(a1)
  1353. ;        move.l    #$f24,$84(a6)
  1354. ;.nof28
  1355.         movem.l    (a7)+,d0/a1
  1356.         rts
  1357.  
  1358. save_CIA    movem.l    a0-a1,-(a7)
  1359.  
  1360. ;        lea.l    Action_CIAA,a0
  1361. ;        lea.l    CIAA,a1
  1362. ;        move.b    $1(a0),(a1)+
  1363. ;        move.b    $101(a0),(a1)+
  1364. ;        move.b    $201(a0),(a1)+
  1365. ;        move.b    $301(a0),(a1)+
  1366. ;        move.b    $401(a0),(a1)+
  1367. ;        move.b    $501(a0),(a1)+
  1368. ;        move.b    $601(a0),(a1)+
  1369. ;        move.b    $701(a0),(a1)+
  1370. ;        move.b    $801(a0),(a1)+
  1371. ;        move.b    $901(a0),(a1)+
  1372. ;        move.b    $a01(a0),(a1)+
  1373. ;        move.b    $b01(a0),(a1)+
  1374. ;        move.b    $c01(a0),(a1)+
  1375. ;        move.b    $d01(a0),(a1)+
  1376. ;        move.b    $e01(a0),(a1)+
  1377. ;        move.b    $f01(a0),(a1)+
  1378. ;
  1379. ;        lea.l    Action_CIAB,a0
  1380. ;        lea.l    CIAB,a1
  1381. ;        move.b    (a0),(a1)+
  1382. ;        move.b    $100(a0),(a1)+
  1383. ;        move.b    $200(a0),(a1)+
  1384. ;        move.b    $300(a0),(a1)+
  1385. ;        move.b    $400(a0),(a1)+
  1386. ;        move.b    $500(a0),(a1)+
  1387. ;        move.b    $600(a0),(a1)+
  1388. ;        move.b    $700(a0),(a1)+
  1389. ;        move.b    $800(a0),(a1)+
  1390. ;        move.b    $900(a0),(a1)+
  1391. ;        move.b    $a00(a0),(a1)+
  1392. ;        move.b    $b00(a0),(a1)+
  1393. ;        move.b    $c00(a0),(a1)+
  1394. ;        move.b    $d00(a0),(a1)+
  1395. ;        move.b    $e00(a0),(a1)+
  1396. ;        move.b    $f00(a0),(a1)+
  1397.  
  1398.         move.b    #$c0,$bfd200        ;reinit CIAs
  1399.         move.b    #$ff,$bfd300        ;for
  1400.         move.b    #$03,$bfe201        ;AR
  1401. ;        move.b    #$7f,$bfec01
  1402.         move.b    #$00,$bfee01
  1403.         move.b    #$88,$bfed01
  1404.         move.b    #$ff,$bfd100
  1405.         sf    mot_on
  1406.  
  1407.         move.w #$0f00,$34(a6)        ;reinit right-mouse button
  1408.  
  1409.         movem.l    (a7)+,a0-a1
  1410.         rts
  1411.  
  1412. restore_CIA    movem.l    a0-a1,-(a7)
  1413.  
  1414. ;        lea.l    $bfe000,a0
  1415. ;        lea.l    CIAA,a1
  1416. ;        clr.b    $e01(a0)
  1417. ;        clr.b    $f01(a0)
  1418. ;        move.b    (a1),$1(a0)
  1419. ;        move.b    1(a1),$101(a0)
  1420. ;        move.b    2(a1),$201(a0)
  1421. ;        move.b    3(a1),$301(a0)
  1422. ;        move.b    4(a1),$401(a0)
  1423. ;        move.b    5(a1),$501(a0)
  1424. ;        move.b    6(a1),$601(a0)
  1425. ;        move.b    7(a1),$701(a0)
  1426. ;        move.b    8(a1),$801(a0)
  1427. ;        move.b    9(a1),$901(a0)
  1428. ;        move.b    10(a1),$a01(a0)
  1429. ;        move.b    11(a1),$b01(a0)
  1430. ;        move.b    12(a1),$c01(a0)
  1431. ;        move.b    14(a1),$e01(a0)
  1432. ;        move.b    15(a1),$f01(a0)
  1433. ;        move.b    13(a1),$d01(a0)
  1434. ;
  1435. ;        lea.l    $bfd000,a0
  1436. ;        lea.l    CIAB,a1
  1437. ;        clr.b    $e00(a0)
  1438. ;        clr.b    $f00(a0)
  1439. ;        move.b    (a1),(a0)
  1440. ;        move.b    1(a1),$100(a0)
  1441. ;        move.b    2(a1),$200(a0)
  1442. ;        move.b    3(a1),$300(a0)
  1443. ;        move.b    4(a1),$400(a0)
  1444. ;        move.b    5(a1),$500(a0)
  1445. ;        move.b    6(a1),$600(a0)
  1446. ;        move.b    7(a1),$700(a0)
  1447. ;        move.b    8(a1),$800(a0)
  1448. ;        move.b    9(a1),$900(a0)
  1449. ;        move.b    10(a1),$a00(a0)
  1450. ;        move.b    11(a1),$b00(a0)
  1451. ;        move.b    12(a1),$c00(a0)
  1452. ;        move.b    14(a1),$e00(a0)
  1453. ;        move.b    15(a1),$f00(a0)
  1454. ;        move.b    13(a1),$d00(a0)
  1455.  
  1456.         movem.l    (a7)+,a0-a1
  1457.         rts
  1458.  
  1459. ***********************************************************
  1460. ; update status line (at bottom of screen)
  1461.  
  1462. print_status:    movem.l    d0-d3/a0,-(a7)
  1463.         lea.l    insert_off_txt,a0
  1464.         tst.b    insert_mode
  1465.         beq.b    .ok_ins_off
  1466.         lea.l    insert_on_txt,a0
  1467. .ok_ins_off    moveq    #76,d0
  1468.         move.w    screen_height,d1
  1469.         subq.w    #1,d1
  1470.         moveq    #3-1,d3
  1471. .loop        move.b    (a0)+,d2
  1472.         bsr    print_char2
  1473.         addq.w    #1,d0
  1474.         dbf    d3,.loop
  1475.  
  1476.         lea.l    start(pc),a0
  1477.         move.l    a0,d0
  1478.         lea.l    watch_txt,a0
  1479.         moveq    #8,d1
  1480.         bsr    conv_hex
  1481.         move.w    screen_height,d1
  1482.         subq.w    #1,d1
  1483.         moveq    #47,d0
  1484.         moveq    #8-1,d3
  1485. .loop2        move.b    (a0)+,d2
  1486.         bsr    print_char2
  1487.         addq.w    #1,d0
  1488.         dbf    d3,.loop2
  1489.  
  1490.         movem.l    (a7)+,d0-d3/a0
  1491.         rts
  1492.  
  1493. ***********************************************************
  1494.  
  1495. super        move.w    #$2000,sr        ;enable interrupts
  1496.  
  1497.         cmp.b    #1,config_screen
  1498.         bne.b    .nontsc
  1499.         move.w    #0,$1dc(a6)        ;NTSC mode 15Khz
  1500.         bra.b    .okscreen
  1501. .nontsc        move.w    #$20,$1dc(a6)        ;PAL mode 15Khz
  1502. .okscreen
  1503.         jsr    read_palette
  1504.  
  1505.         bsr    clear_break
  1506.  
  1507.         move.l    vbr_reg,a4
  1508.         move.l    illegal_except,d0    ;restore vector used
  1509.         beq.b    no_illegal_init        ;by breakpoint
  1510.         move.l    d0,$10(a4)
  1511. no_illegal_init
  1512.  
  1513.         bsr    set_pic        ;init display area
  1514.  
  1515.         moveq    #0,d0
  1516.         lea.l    $140(a6),a0
  1517.         moveq    #$16-1,d1
  1518. clr_spr        move.l    d0,(a0)+        ;clear sprites data
  1519.         dbf    d1,clr_spr
  1520.  
  1521.         bsr    print_page
  1522.  
  1523.         tst.b    trace_moni        ;in tracer ?
  1524.         bne.b    no_print_trace
  1525.  
  1526.         bsr    check_debug        ;print debug entry message
  1527.  
  1528.         tst.b    BP_reach        ;entered from BreakPoint ?
  1529.         beq.b    no_BP_enter
  1530.         move.l    Break_Address,d0
  1531.         moveq    #8,d1
  1532.         lea.l    BP_enter_txt,a0
  1533.         bsr    print_curs
  1534.         bsr    print_hexCR
  1535. no_BP_enter
  1536.         tst.b    BPJ_reach        ;entered from JSR BP ?
  1537.         beq.b    no_BPJ_enter
  1538.         move.l    Break_Address,d0
  1539.         moveq    #8,d1
  1540.         lea.l    BPJ_enter_txt,a0
  1541.         bsr    print_curs
  1542.         bsr    print_hexCR
  1543. no_BPJ_enter
  1544.         bsr    clear_cursor
  1545.         clr.w    cursor_x
  1546.  
  1547.         bsr    ShowWatchEntry
  1548.  
  1549.         move.l    ssp_reg,a0        ;stackframe
  1550.         jsr    _ShowEntryReason
  1551.         bsr    print_reg        ;print CPU registers
  1552.         move.l    pc_reg,dis_ptr
  1553.         bsr    single_inst        ;disassemble 1 instr. at PC
  1554.  
  1555. no_print_trace
  1556.         sf    escape
  1557.  
  1558.         tst.b    BPatPC
  1559.         beq.b    .noPC
  1560.         st    escape
  1561. .noPC
  1562.         sf    p_used            ;clr signal to allow sp command
  1563.         bsr    force_change        ;force floppy disk change
  1564.  
  1565. ;.joy        move.w    #0,$dff106
  1566. ;        move.w    #$f,$dff180
  1567. ;        btst    #7,$bfe001
  1568. ;        bne.b    .joy
  1569.  
  1570. .raster        move.l    $4(a6),d0
  1571.         lsr.l    #1,d0
  1572.         lsr.w    #7,d0
  1573.         cmp.w    #$f0,d0
  1574.         blt.b    .raster
  1575.  
  1576.         move.b    #$7f,key_prev
  1577.  
  1578.         tst.b    config_IDE
  1579.         beq.b    .noIDEirq
  1580.         move.l    ide_irq,d0
  1581.         beq.b    .noIDEirq
  1582.         move.l    d0,a3
  1583.         tst.b    (a3)
  1584.         bpl.b    .noIDEirq
  1585.         move.l    ide_base,a3
  1586.         jsr    wait_irq        ;remove IRQ request from IDE
  1587. .noIDEirq
  1588.         bsr    print_status
  1589.  
  1590.         moveq    #0,d2
  1591.         move.b    config_delay,d2
  1592.         move.w    d2,time_repeat
  1593.  
  1594.         move.w    #$7fff,$9c(a6)        ;disable all INTREQ
  1595.         move.w    #$8300,$96(a6)        ;bitplan DMA on
  1596.         move.w    #$c020,$9a(a6)        ;VBL+CIAA IRQ on
  1597.  
  1598.         moveq    #3-1,d0
  1599. .loopk        sf    VBL
  1600. .waitk        tst.b    VBL            ;wait to flush keyboard
  1601.         beq.b    .waitk            ;buffer
  1602.         dbf    d0,.loopk
  1603.  
  1604.         clr.w    nb_keys
  1605.  
  1606. ;-------------- Main Loop ---------------------------------
  1607.  
  1608. wait        tst.w    nb_keys
  1609.         bne.b    .go_fast
  1610.         stop    #$2000
  1611.  
  1612. .go_fast
  1613.  
  1614. ;-------------- handle repeat key --------------------
  1615.  
  1616.         move.w    #$2700,sr
  1617.         move.b    key_prev,d0
  1618.         move.w    nb_keys,d1        ;key in buffer ?
  1619.         beq.b    .no_key
  1620.         subq.w    #1,nb_keys
  1621.         subq.w    #1,d1
  1622.         lea.l    key_buffer,a0
  1623.         move.b    (a0),d0
  1624. .copy        move.b    1(a0),(a0)+        ;remove one key from buffer
  1625.         dbf    d1,.copy
  1626. .no_key        move.w    #$2000,sr
  1627.  
  1628.         move.b    d0,d1
  1629.         cmp.b    key_prev,d0
  1630.         beq.b    same_key
  1631.         moveq    #0,d2
  1632.         move.b    config_delay,d2
  1633.         move.w    d2,time_repeat
  1634.         bra.b    ok_same_key
  1635. same_key
  1636.         tst.w    time_repeat
  1637.         bmi.w    ok_same_key
  1638.         move.b    #$7f,d0
  1639.  
  1640. ok_same_key    move.b    d1,key_prev
  1641.         move.b    d0,key
  1642.  
  1643. ;-------------- main stuff ---------------------------
  1644.  
  1645.         bsr    special_keys
  1646.  
  1647.         tst.b    trace_moni    ;tracer on ?
  1648.         beq.b    .go_key
  1649.         bsr.w    do_tracer
  1650.         bra.b    .no_key
  1651.  
  1652. .go_key        bsr    normal_keys
  1653.  
  1654. .no_key        tst.b    escape        ;quit HRTmon ?
  1655.         beq.w    wait
  1656.  
  1657. ;-------------- exit ---------------------------------
  1658.  
  1659. out_mon        st    tracer_refresh
  1660.         move.w    #$2700,sr
  1661.         move.w    #$7fff,$9a(a6)
  1662.         move.w    #$7fff,$96(a6)
  1663.         move.w    #$7fff,$9c(a6)
  1664.  
  1665.         tst.b    trace_moni
  1666.         bne.b    .noclr
  1667.         bsr    clear_cursor
  1668. .noclr
  1669.         bsr    remove_pic
  1670.  
  1671.         jsr    restore_palette
  1672.  
  1673.         bsr    init_break        ;set breakpoints
  1674.  
  1675.         move.w    drive,-(a7)
  1676.         moveq    #3,d4            ;first drive SEL (drive0)
  1677.         lea.l    drive_present,a3
  1678.         moveq    #4-1,d5            ;4 drives
  1679. .loopd        tst.b    (a3)+
  1680.         beq.b    .nodrive
  1681.         move.w    d4,drive        ;restore
  1682.         bsr    rest_head        ;floppy drive head pos
  1683. .nodrive    addq.w    #1,d4
  1684.         dbf    d5,.loopd
  1685.         move.w    (a7)+,drive
  1686.  
  1687.         rts
  1688.  
  1689. *******************************************************
  1690. ;------------------------------------------------
  1691. ;-------------- get a key from keyboard ---------
  1692. ;-------------- used for confirmation y/n -------
  1693.  
  1694. ;<- d0=key (ascII)
  1695.  
  1696. get_key        clr.w    nb_keys
  1697. .wait        tst.w    nb_keys
  1698.         beq.b    .wait
  1699.         tst.b    key_buffer    ;key released ?
  1700.         bmi.b    get_key
  1701.         move.w    #$2700,sr
  1702.         clr.w    nb_keys
  1703.         moveq    #0,d0
  1704.         move.b    key_buffer,d0
  1705.         move.b    #$7f,key_prev
  1706.         move.w    #$2000,sr
  1707.         move.l    a0,-(a7)
  1708.         move.l    board_ptr,a0
  1709.         move.b    (a0,d0.w),d0
  1710.         move.l    (a7)+,a0
  1711.         rts
  1712.  
  1713. *******************************************************
  1714. ;-------------- Tracer --------------------------------
  1715.  
  1716. do_tracer    movem.l    d0-d7/a0-a6,-(a7)
  1717.  
  1718.         tst.b    tracer_refresh
  1719.         beq.w    .no_ref
  1720.         sf    tracer_refresh
  1721.         clr.l    cursor_x
  1722.         bsr    print_reg
  1723.  
  1724.         lea.l    empty_txt,a0
  1725.         bsr    print
  1726.  
  1727.         lea.l    tracer_addr,a3
  1728.         move.l    pc_reg,a4
  1729.  
  1730.         moveq    #5,d6            ;no of actual line
  1731.         move.w    screen_height,d0
  1732.         sub.w    #11,d0
  1733. .seek        cmp.l    (a3)+,a4
  1734.         beq.b    .found
  1735.         addq.l    #1,d6
  1736.         dbf    d0,.seek
  1737.  
  1738.         moveq    #5,d6
  1739.         lea.l    tracer_addr,a3
  1740.  
  1741.         move.w    screen_height,d7
  1742.         sub.w    #11,d7
  1743. .loop        move.l    a4,(a3)+
  1744.         move.l    a4,-(a7)
  1745.         bsr    reloc_pic
  1746.         lea.l    general_txt,a0
  1747.         moveq    #7,d0        ;upper case, d $address,indir. address
  1748.         jsr    disassemble
  1749.         move.l    (a7)+,a4
  1750.         add.w    d0,a4
  1751.         lea.l    general_txt,a0
  1752.         bsr    print
  1753.         dbf    d7,.loop
  1754.  
  1755. .found
  1756.     movem.w    d0-d1,-(a7)
  1757.     movem.w    actual_pos,d0-d1
  1758.     tst.w    d0
  1759.     bmi.b    .no
  1760.     move.b    #' ',d2
  1761.     bsr    print_char        ;clear old '>'
  1762. .no    movem.w    (a7)+,d0-d1
  1763.  
  1764.         moveq    #11,d0
  1765.         move.l    d6,d1
  1766.         movem.w    d0-d1,actual_pos
  1767.         move.b    #'>',d2
  1768.         bsr    print_char
  1769.  
  1770. .no_ref
  1771.         lea.l    key,a0
  1772.         cmp.b    #$7f,d0
  1773.         beq.w    .nok
  1774.         cmp.b    #$4e,d0
  1775.         bne.b    .nor
  1776.         move.b    #$7f,(a0)
  1777.         move.w    #1,trace_count
  1778.         st    escape
  1779.         st    tracer_refresh
  1780. .nor        cmp.b    #$4d,d0
  1781.         bne.b    .nodown
  1782.         move.b    #$7f,(a0)
  1783.         movem.w    actual_pos,d0-d1
  1784.         move.l    ascII_ptr,a1
  1785.         mulu    #80,d1
  1786.         add.l    d1,a1
  1787.         cmp.b    #'J',1(a1,d0.w)
  1788.         bne.b    .no_jsr
  1789.         cmp.b    #'S',2(a1,d0.w)
  1790.         bne.b    .no_jsr
  1791.         cmp.b    #'R',3(a1,d0.w)
  1792.         beq.b    .go_bsr
  1793.  
  1794. .no_jsr
  1795.         cmp.b    #'B',1(a1,d0.w)
  1796.         bne.b    .no_bsr
  1797.         cmp.b    #'S',2(a1,d0.w)
  1798.         bne.b    .no_bsr
  1799.         cmp.b    #'R',3(a1,d0.w)
  1800.         bne.b    .no_bsr
  1801.  
  1802. .go_bsr        st    trace_bsr
  1803. .no_bsr        move.w    #1,trace_count
  1804.         st    escape
  1805.         st    tracer_refresh
  1806.  
  1807. .nodown
  1808. .nok
  1809.         movem.l    (a7)+,d0-d7/a0-a6
  1810.         rts
  1811.  
  1812. empty_txt    dcb.b 79," "
  1813.         dc.b $a,0
  1814.         even
  1815.  
  1816. *******************************************************
  1817. ;-------------- restore pic-mem area used by display --
  1818.  
  1819. remove_pic    tst.b    pic_status
  1820.         beq.b    .okpic
  1821.         sf    pic_status
  1822.         move.w    #$2700,sr
  1823.         st    no_print
  1824.  
  1825.         tst.w    proc_type
  1826.         bne.b    .no68000
  1827.         move.l    backup_vbr+$6c,$6c.w
  1828. .no68000
  1829.         movem.l    d0/a0-a1,-(a7)
  1830.         moveq    #0,d0
  1831.         move.w    d0,$dff106
  1832.         move.l    d0,$dff180
  1833.         move.l    pic_ptr,a0
  1834.         lea.l    backup_pic,a1
  1835.         move.w    #PICSIZE/4-1,d0
  1836. .copy        move.l    (a1)+,(a0)+
  1837.         dbf    d0,.copy
  1838.         movem.l    (a7)+,d0/a0-a1
  1839. .okpic        rts
  1840.  
  1841. ;-------------- save pic-mem area and print pic -------
  1842.  
  1843. set_pic        tst.b    pic_status
  1844.         bne.b    .okpic
  1845.         st    pic_status
  1846.  
  1847.         tst.w    proc_type
  1848.         bne.b    .no68000
  1849.         move.l    #newirq,$6c.w
  1850. .no68000
  1851.  
  1852.         movem.l    d0/a0-a1,-(a7)
  1853.         move.l    pic_ptr,a0
  1854.         lea.l    backup_pic,a1
  1855.         move.w    #PICSIZE/4-1,d0
  1856. .copy        move.l    (a0)+,(a1)+
  1857.         dbf    d0,.copy
  1858.         movem.l    (a7)+,d0/a0-a1
  1859.         sf    no_print
  1860.         bsr    print_page
  1861.         move.w    #$2000,sr
  1862. .okpic        rts
  1863.  
  1864. ***********************************************************
  1865. ;-------------- jmp here when a keyboard reset-warn code --
  1866. ;-------------- has been received -------------------------
  1867.  
  1868. go_reset    move.w    #$2700,sr
  1869.         clr.l    inited
  1870.         sf    entered
  1871.         move.l    $f80004,a0
  1872.         subq.l    #2,a0
  1873.         move.w    #0,$dff100
  1874.         move.w    #0,$dff1dc
  1875.         jmp    (a0)
  1876.  
  1877. ***********************************************************
  1878. ;-------------- VBL interrupt handler ---------------------
  1879.  
  1880. newirq        movem.l    d0-d7/a0-a6,-(a7)
  1881.         lea.l    $dff000,a6
  1882.  
  1883.         st    VBL        ;signal a VBL
  1884.  
  1885. ;-------------- init display registers ----------
  1886.         move.l    pic_ptr(pc),d0
  1887.  
  1888.         cmp.b    #1,config_screen
  1889.         bne.b    .nontsc
  1890.  
  1891.         move.l    #$90010000,$100(a6)
  1892.         move.l    #$3081f7c1,$8e(a6)
  1893.         move.w    #$0,$1dc(a6)
  1894.  
  1895.         move.l    d0,$e0(a6)
  1896.         move.w    #$0c00,$106(a6)
  1897.         move.w    #$0000,$10c(a6)
  1898.         move.w    color0,$180(a6)
  1899.         move.w    color1,$182(a6)
  1900.         move.l    #$003c00d4,$92(a6)
  1901.         move.w    #0,$108(a6)
  1902.  
  1903.         move.w    #0,$1fc(a6)
  1904.  
  1905.         bra.w    .okmode
  1906.  
  1907.  
  1908. .nontsc        cmp.b    #2,config_screen
  1909.         bne.w    .nomulti
  1910.  
  1911.         move.l    d0,$e0(a6)
  1912.  
  1913.         move.l    #$2c4500e5,$8e(a6)
  1914.         move.l    #$00200068,$92(a6)
  1915.         move.w    #$1b88,$1dc(a6)
  1916.         move.w    #$1241,$100(a6)
  1917.         move.w    #0,$108(a6)
  1918.         move.w    #-80,$10a(a6)
  1919.  
  1920.         move.w    #$0000,$1fc(a6)
  1921.  
  1922.         move.w #$0071,$1c0(a6)
  1923.         move.w #$0008,$1c4(a6)
  1924.         move.w #$000e,$1de(a6)
  1925.         move.w #$001c,$1c2(a6)
  1926.         move.w #$001e,$1c6(a6)
  1927.         move.w #$0046,$1e2(a6)
  1928.         move.w #$020c,$1c8(a6)
  1929.         move.w #$0000,$1cc(a6)
  1930.         move.w #$0003,$1e0(a6)
  1931.         move.w #$0200,$1e4(a6)
  1932.         move.w #$0005,$1ca(a6)
  1933.         move.w #$001d,$1ce(a6)
  1934.         move.w #$0012,$104(a6)
  1935.         move.w #$0c21,$106(a6)
  1936.  
  1937.         move.w    color0,$180(a6)
  1938.         move.w    color1,$182(a6)
  1939.  
  1940.         bra.b    .okmode
  1941.  
  1942. .nomulti
  1943.         move.l    #$90010000,$100(a6)
  1944.         move.l    #$30812cc1,$8e(a6)
  1945.         move.w    #$20,$1dc(a6)
  1946.  
  1947.         move.l    d0,$e0(a6)
  1948.         move.w    #$0c00,$106(a6)
  1949.         move.w    #$0000,$10c(a6)
  1950.         move.w    color0,$180(a6)
  1951.         move.w    color1,$182(a6)
  1952.         move.l    #$003c00d4,$92(a6)
  1953.         move.w    #0,$108(a6)
  1954.  
  1955.         move.w    #0,$1fc(a6)
  1956.  
  1957. .okmode
  1958.  
  1959.  
  1960.         tst.b    trace_moni        ;test if in Tracer
  1961.         bne.b    .no_cur
  1962.         bsr    do_cursor
  1963. .no_cur
  1964.         tst.w    time_repeat
  1965.         bmi.b    no_sub_repeat
  1966.         subq.w    #1,time_repeat        ;for repeat key
  1967. no_sub_repeat
  1968.         bsr    do_watch
  1969.  
  1970.         bsr.b    newirq2
  1971.  
  1972.         move.w    #$20,$9c(a6)        ;interrupt ACK
  1973.         movem.l    (a7)+,d0-d7/a0-a6
  1974.         rte
  1975.  
  1976. ; "IRQ handler" of CIA-A (keyboard)
  1977.  
  1978. newirq2        movem.l    d0-d1/a0/a1/a5-a6,-(a7)
  1979.         lea.l    $dff000,a6
  1980.  
  1981.         move.b    $bfed01,d0
  1982.         btst    #3,d0            ;test if interrupt from keyboard
  1983.         beq    .pas_key
  1984.  
  1985.         move.b    $bfec01,d0        ;get key
  1986.         not.b    d0
  1987.         ror.b    #1,d0
  1988.  
  1989.         cmp.b    #$78,d0
  1990.         beq.w    go_reset
  1991.  
  1992.         cmp.b    #$45,d0
  1993.         bne.b    .no_break
  1994.         st    break
  1995. .no_break
  1996.         tst.b    new_key            ;test if waiting for key-pressed
  1997.         bne.b    .no_buf
  1998.  
  1999.         cmp.w    #64-1,nb_keys
  2000.         beq.b    .pas_key
  2001.  
  2002.         lea.l    key_buffer,a0
  2003.         move.w    nb_keys,d1
  2004.         move.b    d0,(a0,d1.w)        ;save key in key buffer
  2005.         addq.w    #1,nb_keys
  2006. .no_buf        btst    #7,d0
  2007.         bne.b    .nonew
  2008.         sf    new_key
  2009. .nonew        bset    #6,$bfee01
  2010.         moveq    #3-1,d1
  2011. .wait        move.b    6(a6),d0        ;wait 3 raster lines
  2012. .ras        cmp.b    6(a6),d0
  2013.         beq.b    .ras
  2014.         dbf    d1,.wait
  2015.         bclr    #6,$bfee01
  2016. .pas_key
  2017.         movem.l    (a7)+,d0-d1/a0/a1/a5-a6
  2018.         rts
  2019.  
  2020.  
  2021. ********************************************************************
  2022. ;------------- Display the actual address of a search process ------
  2023. ;------------- at the bottom of the screen -------------------------
  2024.  
  2025. do_watch    movem.l    d0-d3/a0-a1,-(a7)
  2026.  
  2027.         lea.l    watch_txt,a0
  2028.         moveq    #8,d1
  2029.         move.l    watch,d0
  2030.         bsr    conv_hex
  2031.  
  2032.         lea.l    watch_txt,a0
  2033.         moveq    #31,d0
  2034.         move.w    screen_height,d1
  2035.         subq.w    #1,d1
  2036.         moveq    #8-1,d3
  2037. .print        move.b    (a0)+,d2
  2038.         bsr    print_char2
  2039.         addq.w    #1,d0
  2040.         dbf    d3,.print
  2041.  
  2042.         move.w    drive,d2
  2043.         add.b    #'0'-3,d2
  2044.         moveq    #18,d0
  2045.         move.w    screen_height,d1
  2046.         subq.w    #1,d1
  2047.         bsr    print_char2
  2048.  
  2049.         lea.l    track,a1
  2050.         move.w    drive,d0
  2051.         add.w    d0,d0
  2052.         move.w    -3*2(a1,d0.w),d0
  2053.         lea.l    watch_txt,a0
  2054.         lsr.w    #1,d0
  2055.         moveq    #0,d1
  2056.         move.b    #128+2,d1
  2057.         bsr    conv_dec
  2058.         moveq    #7,d0
  2059.         move.w    screen_height,d1
  2060.         subq.w    #1,d1
  2061.         moveq    #2-1,d3
  2062.         lea.l    watch_txt+1,a0
  2063. .print2        move.b    (a0)+,d2
  2064.         bsr    print_char2
  2065.         addq.w    #1,d0
  2066.         dbf    d3,.print2
  2067.  
  2068.  
  2069.         movem.l    (a7)+,d0-d3/a0-a1
  2070.         rts
  2071.  
  2072. *******************************************************
  2073. ;print ascII page
  2074.  
  2075. print_page    movem.l    d0-d1,-(a7)
  2076.         moveq    #0,d0
  2077.         move.w    screen_height,d1
  2078.         subq.w    #1,d1
  2079. next_page_all    bsr    print_line
  2080.         addq.w    #1,d0
  2081.         dbf    d1,next_page_all
  2082.         movem.l    (a7)+,d0-d1
  2083.         rts
  2084.  
  2085. ************************************************************
  2086. ;-------------- handle all special keys --------------------
  2087. ;-------------- shift,backspace,F1-F10,etc... --------------
  2088.  
  2089. special_keys    lea.l    key,a0
  2090.         move.b    (a0),d0
  2091.         cmp.b    #$7f,d0
  2092.         beq.w    no_special_keys
  2093.  
  2094.         cmp.b    #$60,d0
  2095.         blt.b    no_shift_on
  2096.         cmp.b    #$62,d0
  2097.         bgt.b    no_shift_on
  2098.         st    shift_mode
  2099.         move.b    #$7f,(a0)
  2100.  
  2101. no_shift_on    cmp.b    #$60+$80,d0
  2102.         blt.b    no_shift_off
  2103.         cmp.b    #$62+$80,d0
  2104.         bgt.b    no_shift_off
  2105.         sf    shift_mode
  2106.         move.b    #$7f,(a0)
  2107. no_shift_off
  2108.         cmp.b    #$63,d0
  2109.         bne.b    .no_ctrl_on
  2110.         st    ctrl_mode
  2111.         move.b    #$7f,(a0)
  2112. .no_ctrl_on
  2113.         cmp.b    #$63+$80,d0
  2114.         bne.b    .no_ctrl_off
  2115.         sf    ctrl_mode
  2116.         move.b    #$7f,(a0)
  2117. .no_ctrl_off
  2118.         cmp.b    #$64,d0
  2119.         beq.b    .alt_on
  2120.         cmp.b    #$65,d0
  2121.         bne.b    .no_alt_on
  2122. .alt_on        st    alt_mode
  2123.         move.b    #$7f,(a0)
  2124. .no_alt_on
  2125.         cmp.b    #$64+$80,d0
  2126.         beq.b    .alt_off
  2127.         cmp.b    #$65+$80,d0
  2128.         bne.b    .no_alt_off
  2129. .alt_off    sf    alt_mode
  2130.         move.b    #$7f,(a0)
  2131. .no_alt_off
  2132.         cmp.b    #$66,d0
  2133.         beq.b    .amiga_on
  2134.         cmp.b    #$67,d0
  2135.         bne.b    .no_amiga_on
  2136. .amiga_on    st    amiga_mode
  2137.         move.b    #$7f,(a0)
  2138. .no_amiga_on
  2139.         cmp.b    #$66+$80,d0
  2140.         beq.b    .amiga_off
  2141.         cmp.b    #$67+$80,d0
  2142.         bne.b    .no_amiga_off
  2143. .amiga_off    sf    amiga_mode
  2144.         move.b    #$7f,(a0)
  2145. .no_amiga_off
  2146.  
  2147.         tst.b    d0
  2148.         bmi.w    no_special_keys
  2149.  
  2150.         lea.l    cursor_x,a3
  2151.  
  2152.         tst.b    trace_moni
  2153.         bne.w    no_speck1
  2154.  
  2155.         cmp.b    #$45,d0
  2156.         bne.b    no_esc
  2157.         move.b    #$7f,(a0)
  2158. no_esc
  2159.  
  2160. ;-------------- Return -------------------------------
  2161.         cmp.b    #$43,d0
  2162.         beq.b    ok_return
  2163.         cmp.b    #$44,d0
  2164.         bne.b    no_cr
  2165.  
  2166. ok_return    bsr    clear_cursor
  2167.         clr.w    (a3)
  2168.         move.b    #$7f,(a0)
  2169.  
  2170.         clr.w    (a3)
  2171.         move.w    window_bot,d1
  2172.         cmp.w    2(a3),d1
  2173.         bgt.b    ok_do_cr
  2174.         bsr    scroll_up
  2175.         subq.w    #1,2(a3)
  2176. ok_do_cr    addq.w    #1,2(a3)
  2177.  
  2178.         bsr    command_line
  2179.  
  2180.         bsr    set_cursor
  2181. no_cr
  2182. ;-------------- arrow keys --------------------------
  2183.  
  2184.         cmp.b    #$4f,d0
  2185.         bne.b    no_left
  2186.         move.b    #$7f,(a0)
  2187.         bsr    clear_cursor
  2188.         tst.b    shift_mode
  2189.         beq.b    .no_sh
  2190.         clr.w    (a3)
  2191.         bra.b    .ok_sh
  2192. .no_sh        tst.w    (a3)
  2193.         bne.b    .ok_left_edge
  2194.         move.w    #80,(a3)        ;-1 -> 79
  2195.         tst.w    2(a3)
  2196.         bne.b    .ok_top_edge
  2197.         addq.w    #1,2(a3)        ;keep 0 coz -1 later
  2198.         bsr    scroll_down
  2199. .ok_top_edge    subq.w    #1,2(a3)
  2200. .ok_left_edge    subq.w    #1,(a3)
  2201. .ok_sh        bsr    set_cursor
  2202.  
  2203. no_left        cmp.b    #$4e,d0
  2204.         bne.b    no_right
  2205.         move.b    #$7f,(a0)
  2206.         bsr    clear_cursor
  2207.         tst.b    shift_mode
  2208.         beq.b    .no_sh
  2209.         move.w    #79,(a3)
  2210.         bra.b    .ok_sh
  2211. .no_sh        cmp.w    #79,(a3)
  2212.         blt.b    .ok_right_edge
  2213.         move.w    #-1,(a3)
  2214.         move.w    window_bot,d1
  2215.         cmp.w    2(a3),d1
  2216.         bgt.b    .ok_bot_edge
  2217.         subq.w    #1,2(a3)        ;keep 24 coz +1 later
  2218.         bsr    scroll_up
  2219. .ok_bot_edge    addq.w    #1,2(a3)
  2220. .ok_right_edge    addq.w    #1,(a3)
  2221. .ok_sh        bsr    set_cursor
  2222.  
  2223. no_right
  2224.         cmp.b    #$4c,d0
  2225.         bne.w    no_up
  2226.         move.b    #$7f,(a0)
  2227.         bsr    clear_cursor
  2228.  
  2229.         tst.b    shift_mode
  2230.         beq.b    .noshift
  2231.         move.w    (2,a3),d1
  2232.         clr.w    (2,a3)            ;move cursor to top of screen
  2233.         tst.w    d1
  2234.         beq.b    .no_ctrl
  2235.         bra.w    .end_up
  2236.  
  2237. .noshift    tst.b    ctrl_mode
  2238.         beq.b    .no_ctrl
  2239.         movem.l    d0/a0,-(a7)
  2240.         clr.w    (a3)
  2241.         moveq    #16-1,d1            ;nb history lines
  2242. .loop        subq.w    #1,history_disp
  2243.         and.w    #$f,history_disp
  2244.         move.w    history_disp,d0
  2245.         mulu    #80,d0
  2246.         lea.l    history,a0
  2247.         add.l    d0,a0
  2248.         tst.b    (a0)
  2249.         dbne    d1,.loop
  2250.         bsr    print
  2251.         lea.l    79(a0),a0
  2252. .back        cmp.b    #' ',-(a0)
  2253.         bne.b    .no_spc
  2254.         subq.w    #1,(a3)
  2255.         bra.b    .back
  2256. .no_spc        movem.l    (a7)+,d0/a0
  2257.         bra.b    .end_up
  2258.  
  2259. .no_ctrl    tst.w    2(a3)
  2260.         bne.b    .ok_up
  2261.         moveq    #1,d2            ;scroll 1 line
  2262.         tst.b    shift_mode
  2263.         beq.b    .no_sh2
  2264.         clr.w    (a3)
  2265.         moveq    #SC_STEP,d2
  2266. .no_sh2        movem.l    d0-a4,-(a7)
  2267.         move.l    last_cmd,a0
  2268.         tst.l    (12,a0)
  2269.         sne    no_sc_clr
  2270.         bsr    scroll_down2
  2271.         move.l    (12,a0),d0
  2272.         beq.b    .no_up_cmd
  2273.         move.l    d0,a1
  2274.         jsr    (a1)
  2275.         beq.b    .no_up_cmd
  2276.         bsr    print_page
  2277. .no_up_cmd    movem.l    (a7)+,d0-a4
  2278.         bra.b    .end_up
  2279. .ok_up        subq.w    #1,2(a3)
  2280. .end_up        bsr    set_cursor
  2281.  
  2282. no_up
  2283.         cmp.b    #$4d,d0
  2284.         bne.w    no_down
  2285.         move.b    #$7f,(a0)
  2286.         bsr    clear_cursor
  2287.  
  2288.         tst.b    shift_mode
  2289.         beq.b    .noshift
  2290.         move.w    (2,a3),d1
  2291.         move.w    window_bot,(2,a3)    ;move cursor to bot. of screen
  2292.         cmp.w    window_bot,d1
  2293.         beq.b    .no_ctrl
  2294.         bra.w    .end_down
  2295.  
  2296. .noshift    tst.b    ctrl_mode
  2297.         beq.b    .no_ctrl
  2298.         movem.l    d0/a0,-(a7)
  2299.         clr.w    (a3)
  2300.         moveq    #16-1,d1
  2301. .loop        addq.w    #1,history_disp
  2302.         and.w    #$f,history_disp
  2303.         move.w    history_disp,d0
  2304.         mulu    #80,d0
  2305.         lea.l    history,a0
  2306.         add.l    d0,a0
  2307.         tst.b    (a0)
  2308.         dbne    d1,.loop
  2309.         bsr    print
  2310.         lea.l    79(a0),a0
  2311. .back        cmp.b    #' ',-(a0)
  2312.         bne.b    .no_spc
  2313.         subq.w    #1,(a3)
  2314.         bra.b    .back
  2315. .no_spc        movem.l    (a7)+,d0/a0
  2316.         bra.b    .end_down
  2317.  
  2318. .no_ctrl    move.w    window_bot,d1
  2319.         cmp.w    2(a3),d1
  2320.         bgt.b    .ok_down
  2321.         moveq    #1,d2            ;scroll 1 line
  2322.         tst.b    shift_mode
  2323.         beq.b    .no_sh2
  2324.         clr.w    (a3)
  2325.         moveq    #SC_STEP,d2
  2326. .no_sh2        movem.l    d0-a4,-(a7)
  2327.         move.l    last_cmd,a0
  2328.         tst.l    (16,a0)
  2329.         sne    no_sc_clr
  2330.         bsr    scroll_up2
  2331.         move.l    (16,a0),d0
  2332.         beq.b    .no_down_cmd
  2333.         move.l    d0,a1
  2334.         jsr    (a1)
  2335.         beq.b    .no_down_cmd
  2336.         bsr    print_page
  2337. .no_down_cmd    movem.l    (a7)+,d0-a4
  2338.         bra.b    .end_down
  2339. .ok_down    addq.w    #1,2(a3)
  2340. .end_down    bsr    set_cursor
  2341. no_down
  2342.  
  2343. ;-------------- switch Tracer page ON/OFF F7 --------------
  2344. no_speck1    cmp.b    #$56,d0
  2345.         bne.b    .no_f7
  2346.         move.b    #$7f,(a0)
  2347.         not.b    trace_moni
  2348.         beq.b    .quittracer
  2349.         bsr    clear_cursor
  2350.         move.l    #ascII_Tracer,d1
  2351.         move.w    #MAX_SCREEN,d2
  2352.         sub.w    screen_height,d2
  2353.         mulu    #80,d2
  2354.         add.l    d2,d1
  2355.         move.l    d1,ascII_ptr
  2356.         bsr    print_page
  2357.         st    trace_moni
  2358.         move.l    cursor_x,old_cursor
  2359.         st    tracer_refresh
  2360.         bra.b    .endF7
  2361.  
  2362. .quittracer    bsr    clear_cursor
  2363.         move.l    old_cursor,cursor_x
  2364.         lea.l    ascII_ptr,a1
  2365.         movem.l    4(a1),d0-d1        ;read ascII_page1,2 ptrs
  2366.         tst.b    ascII_page    ;flip page flag
  2367.         bne.b    .noex2
  2368.         exg    d0,d1
  2369. .noex2        move.l    d1,(a1)            ;set actual page ptr
  2370.         bsr    print_page
  2371.         bsr    set_cursor
  2372. .endF7
  2373.  
  2374. ;-------------- switch page 1/2 F10 -----------------------
  2375. .no_f7
  2376.         cmp.b    #$59,d0
  2377.         bne.b    no_f10
  2378.         move.b    #$7f,(a0)
  2379.         tst.b    trace_moni
  2380.         bne.b    no_f10
  2381.         bsr    clear_cursor
  2382.         lea.l    ascII_ptr,a1
  2383.         movem.l    4(a1),d1-d2        ;read ascII_page1,2 ptrs
  2384.         not.b    ascII_page    ;flip page flag
  2385.         bne.b    .noex
  2386.         exg    d1,d2
  2387. .noex        move.l    d2,(a1)            ;set actual page ptr
  2388.         bsr    print_page
  2389.         bsr    set_cursor
  2390. no_f10
  2391.  
  2392. ;-------------- Clear screen F1 -----------------
  2393.         tst.b    trace_moni
  2394.         bne.w    no_speck2
  2395.  
  2396.         cmp.b    #$50,d0
  2397.         bne.b    no_f1
  2398.         move.b    #$7f,(a0)
  2399.         bsr    clear_cursor
  2400.         move.l    ascII_ptr,a1
  2401.         move.w    window_top,d2
  2402.         mulu    #80,d2
  2403.         add.l    d2,a1
  2404.         move.l    #'    ',d1
  2405.         move.w    window_bot,d2
  2406.         sub.w    window_top,d2
  2407.         addq.w    #1,d2
  2408.         mulu    #20,d2
  2409.         subq.w    #1,d2
  2410. clear_ascII    move.l    d1,(a1)+
  2411.         dbf    d2,clear_ascII
  2412.         bsr    print_page
  2413.         moveq    #0,d1
  2414.         move.w    window_top,d1
  2415.         move.l    d1,cursor_x
  2416.         bsr    set_cursor
  2417. no_f1
  2418. ;-------------- change insert mode F2 -----------
  2419.         cmp.b    #$51,d0
  2420.         bne.b    no_f2
  2421.         move.b    #$7f,(a0)
  2422.         movem.l    d0/a0,-(a7)
  2423.         lea.l    insert_off_txt,a0
  2424.         not.b    insert_mode
  2425.         beq.b    ok_ins_off
  2426.         lea.l    insert_on_txt,a0
  2427. ok_ins_off    moveq    #76,d0
  2428.         move.w    screen_height,d1
  2429.         subq.w    #1,d1
  2430.         moveq    #3-1,d3
  2431. .loop        move.b    (a0)+,d2
  2432.         bsr    print_char2
  2433.         addq.w    #1,d0
  2434.         dbf    d3,.loop
  2435.         movem.l    (a7)+,d0/a0
  2436. no_f2
  2437.  
  2438. ;-------------- change FCPU F6 ------------------
  2439.         cmp.b    #$55,d0
  2440.         bne.b    .no_f5
  2441.         move.b    #$7f,(a0)
  2442.         tst.b    fami_mode
  2443.         beq.b    .was802
  2444.         bsr    set_65802
  2445.         bra.b    .no_f5
  2446. .was802        bsr    set_65816
  2447. .no_f5
  2448. ;-------------- backspace -----------------------
  2449.         cmp.b    #$41,d0
  2450.         bne.w    no_back
  2451.         move.b    #$7f,(a0)
  2452.         tst.b    shift_mode    ;shift+backspace -> clear line
  2453.         beq.b    .no_clr
  2454.  
  2455.         bsr    clear_cursor
  2456.         move.w    d0,-(a7)
  2457.         move.l    ascII_ptr,a1
  2458.         move.w    2(a3),d0
  2459.         mulu    #80,d0
  2460.         add.l    d0,a1
  2461.         moveq    #80-1,d0
  2462. .fill        move.b    #' ',(a1)+
  2463.         dbf    d0,.fill
  2464.         clr.w    (a3)
  2465.         move.w    2(a3),d0
  2466.         bsr    print_line
  2467.         move.w    (a7)+,d0
  2468.         bsr    set_cursor
  2469.         bra.b    no_back
  2470.  
  2471. .no_clr        tst.w    (a3)
  2472.         beq.b    no_back
  2473.         bsr    clear_cursor
  2474.         move.l    ascII_ptr,a1
  2475.         add.w    (a3),a1            ;add x cursor
  2476.         subq.w    #1,a1
  2477.         move.w    2(a3),d1
  2478.         mulu    #80,d1
  2479.         add.l    d1,a1            ;add y cursor
  2480.         lea.l    1(a1),a2
  2481.         moveq    #80-1,d1
  2482.         sub.w    (a3),d1
  2483. scroll_line    move.b    (a2)+,(a1)+
  2484.         dbf    d1,scroll_line
  2485.         move.b    #' ',(a1)+
  2486.         move.w    d0,-(a7)
  2487.         move.w    2(a3),d0
  2488.         bsr    print_line
  2489.         move.w    (a7)+,d0
  2490.         subq.w    #1,(a3)
  2491.         bsr    set_cursor
  2492. no_back
  2493. ;-------------- del -----------------------------
  2494.         cmp.b    #$46,d0
  2495.         bne.b    no_del
  2496.         move.b    #$7f,(a0)
  2497.         bsr    clear_cursor
  2498.  
  2499.         tst.b    shift_mode
  2500.         beq.b    .do_del
  2501.  
  2502.         move.l    ascII_ptr,a1
  2503.         move.w    2(a3),d1
  2504.         mulu    #80,d1
  2505.         add.l    d1,a1
  2506.         lea.l    80(a1),a1
  2507.         lea.l    -1(a1),a2
  2508.         moveq    #80-2,d1
  2509.         sub.w    (a3),d1
  2510.         bmi.b    end_del
  2511. .l        move.b    -(a2),-(a1)
  2512.         dbf    d1,.l
  2513.         move.b    #' ',(a2)
  2514.         bra.b    end_del
  2515.  
  2516. .do_del        move.l    ascII_ptr,a1
  2517.         add.w    (a3),a1            ;add x cursor
  2518.         move.w    2(a3),d1
  2519.         mulu    #80,d1
  2520.         add.l    d1,a1            ;add y cursor
  2521.         lea.l    1(a1),a2
  2522.         moveq    #80-1,d1
  2523.         sub.w    (a3),d1
  2524.         bra.b    do_dbf_scroll
  2525. scroll_line2    move.b    (a2)+,(a1)+
  2526. do_dbf_scroll    dbf    d1,scroll_line2
  2527.         move.b    #' ',(a1)+
  2528. end_del        move.w    d0,-(a7)
  2529.         move.w    2(a3),d0
  2530.         bsr    print_line
  2531.         move.w    (a7)+,d0
  2532.         bsr    set_cursor
  2533.  
  2534. no_del
  2535. ;-------------- HELP print help page ---------------
  2536.  
  2537.         cmp.b    #$5f,d0
  2538.         bne.b    no_help
  2539.         move.b    #$7f,(a0)
  2540.         move.l    a0,-(a7)
  2541.         lea.l    help_txt,a0
  2542.         bsr    print_curs
  2543.         tst.b    break
  2544.         beq.b    .nobrk
  2545.         sf    break
  2546.         lea.l    break_txt,a0
  2547.         bsr    print
  2548. .nobrk        move.l    (a7)+,a0
  2549. no_help
  2550. no_speck2
  2551. no_special_keys    rts
  2552.  
  2553. ;------------------------------------------------
  2554. ;-------------- handle normal keys --------------
  2555. ;-------------- 0-9,a-z,etc... ------------------
  2556.  
  2557. normal_keys    lea.l    key,a0
  2558.         tst.b    snap_buf
  2559.         beq.b    .nos
  2560.         move.b    #$40,(a0)
  2561. .nos        moveq    #0,d0
  2562.         move.b    (a0),d0
  2563.         cmp.b    #$7f,d0
  2564.         beq.w    no_normal_keys
  2565.  
  2566.         move.b    #$7f,(a0)
  2567.  
  2568.         tst.b    d0
  2569.         bmi.w    no_normal_keys
  2570.  
  2571.         bsr    clear_cursor
  2572.  
  2573.         move.l    board_ptr,a1
  2574.         tst.b    shift_mode
  2575.         beq.b    no_shift_mode
  2576.         move.l    board_ptr+4,a1
  2577. no_shift_mode    tst.b    alt_mode
  2578.         beq.b    .no_alt
  2579.         move.l    board_ptr+8,a1
  2580. .no_alt        move.b    (a1,d0.w),d2
  2581.  
  2582.         move.l    a0,-(a7)
  2583.         lea.l    snap_buf,a0
  2584.         tst.b    (a0)
  2585.         beq.b    empty_snap
  2586.  
  2587. resnap        move.b    (a0)+,d2
  2588.  
  2589. empty_snap    lea.l    cursor_x,a3
  2590.  
  2591.         tst.b    insert_mode
  2592.         beq.b    no_insert_mode
  2593. ;-------------- do insert mode -----------------
  2594.         cmp.w    #79,(a3)
  2595.         bge.b    ok_cursor_pos
  2596.         move.l    ascII_ptr,a1
  2597.         move.l    a1,a2
  2598.         add.w    (a3),a1
  2599.         move.w    2(a3),d0
  2600.         mulu    #80,d0
  2601.         add.l    d0,a1
  2602.         add.l    d0,a2
  2603.         lea.l    80(a2),a2
  2604.         lea.l    -1(a2),a4
  2605. do_insert    move.b    -(a4),-(a2)
  2606.         cmp.l    a1,a4
  2607.         bne.b    do_insert
  2608.         move.b    d2,(a1)
  2609.         addq.w    #1,(a3)
  2610.         move.w    2(a3),d0
  2611.         bsr    print_line
  2612.         bra.b    ok_cursor_pos
  2613. ;-----------------------------------------------
  2614. no_insert_mode
  2615.         movem.w    (a3),d0-d1
  2616.         bsr    print_char
  2617.  
  2618.         addq.w    #1,(a3)
  2619.         cmp.w    #80,(a3)
  2620.         blt.b    ok_cursor_pos
  2621.         clr.w    (a3)
  2622.         move.w    window_bot,d1
  2623.         cmp.w    2(a3),d1
  2624.         bgt.b    ok_cursor_h
  2625.         bsr    scroll_up
  2626.         bra.b    ok_cursor_pos
  2627. ok_cursor_h    addq.w    #1,2(a3)
  2628.  
  2629. ok_cursor_pos
  2630.         tst.b    (a0)
  2631.         bne.w    resnap
  2632.  
  2633.         sf    snap_buf
  2634.  
  2635.         move.l    (a7)+,a0
  2636.  
  2637.         bsr    set_cursor
  2638.  
  2639. no_normal_keys    rts
  2640.  
  2641. ************************************************************
  2642. ;-------------- called when RETURN is pressed --------------
  2643.  
  2644. command_line    movem.l    d0-d7/a0-a4,-(a7)
  2645.         lea.l    cursor_x,a3
  2646.         move.w    2(a3),d0        ;read y pos
  2647.         subq.w    #1,d0
  2648.         move.l    ascII_ptr,a0
  2649.         mulu    #80,d0
  2650.         add.l    d0,a0
  2651.         lea.l    command,a1
  2652.         moveq    #80-1,d1
  2653. copy_command    move.b    (a0)+,(a1)+        ;copy current line into
  2654.         dbf    d1,copy_command        ;command
  2655.  
  2656.         sf    d4            ;command repeat signal off
  2657.         lea.l    command,a0
  2658. seek_command    move.b    (a0)+,d0        ;seek command first char
  2659.         beq.b    end_cmd_line
  2660.         cmp.b    #$20,d0
  2661.         beq.b    seek_command
  2662.         bra.b    ok_new_cmd
  2663.  
  2664. end_cmd_line    subq.w    #1,2(a3)        ;if command line is empty
  2665.         move.l    last_cmd,a0        ;then repeat last command
  2666.         addq.l    #1,a0
  2667.         st    d4            ;signal in d4 for cmd repeat
  2668. ok_new_cmd
  2669.         subq.l    #1,a0
  2670.         lea.l    cmd_list,a2
  2671.         moveq    #0,d1            ;command code offset cleared
  2672.  
  2673. .loop2        tst.b    (a2)            ;search if command
  2674.         beq.b    end_cmd_list        ;exists
  2675.         move.l    a2,a3
  2676.         move.l    a0,a1
  2677. .loop        move.b    (a3)+,d3
  2678.         beq.b    .ok_cmp
  2679.         move.b    (a1)+,d0
  2680.         bsr    upper_case
  2681.         cmp.b    d0,d3
  2682.         beq.b    .loop
  2683.  
  2684. .go1        lea.l    20(a2),a2        ;next command in cmd_list
  2685.         bra.b    .loop2
  2686.  
  2687. .ok_cmp        move.l    8(a2),d1        ;command code offset
  2688.         cmp.l    #cmd_x,d1
  2689.         beq.b    .nolast            ;cant't repeat cmd_x
  2690.         move.l    a2,last_cmd
  2691. .nolast        move.l    a1,d2
  2692.         bra.b    .go1            ;check if it's really this cmd
  2693.                         ;to get the longest cmd.
  2694.  
  2695. end_cmd_list    sf    break
  2696.         tst.l    d1
  2697.         beq.b    no_command
  2698.  
  2699.         tst.b    d4            ;test if cmd repeat ?
  2700.         bne.b    .no_hist
  2701.  
  2702.         lea.l    history_cnt,a2
  2703.         move.w    (a2),d0
  2704.         lea.l    history,a0
  2705.         mulu    #80,d0
  2706.         add.l    d0,a0
  2707.         lea.l    command,a1
  2708.         moveq    #79-1,d0
  2709. .copy        move.b    (a1)+,(a0)+        ;copy command in history
  2710.         dbf    d0,.copy
  2711.  
  2712.         addq.w    #1,(a2)
  2713.         and.w    #$f,(a2)        ;maxi 16 history lines
  2714.         move.w    (a2),history_disp
  2715.  
  2716. .no_hist    st    no_curs
  2717.         move.l    d2,a0
  2718.         lea.l    cmd_list(pc),a5
  2719.  
  2720.         sf    disk_op
  2721.         sf    floppy_op
  2722.  
  2723.         move.l    a7,cmd_sp_save
  2724.         st    cmd_executed
  2725.         sf    cmd_crashed
  2726.  
  2727.         move.l    d1,-(a7)        ;jmp (d1.l) exec. the cmd
  2728.         rts
  2729.  
  2730. no_command    lea.l    unknown_txt,a0
  2731.         bsr    print
  2732.         move.l    a7,cmd_sp_save
  2733.  
  2734. end_command    sf    cmd_executed
  2735. ;try to recover from eventual command crash
  2736.         move.l    cmd_sp_save(pc),a7
  2737.         bsr    set_pic
  2738.         move.w    #$2000,sr
  2739.  
  2740.         bsr    end_disk
  2741.  
  2742.         tst.b    cmd_crashed
  2743.         beq.b    .nocrash
  2744.         lea.l    .crash_txt(pc),a0
  2745.         bsr    print
  2746.         lea.l    crash_stack,a0
  2747.         jsr    _ShowEntryReason
  2748.  
  2749. .nocrash
  2750.         tst.b    break            ;ESC pressed during
  2751.         beq.b    .no_break        ;command ?
  2752.         sf    break
  2753.         lea.l    break_txt,a0
  2754.         bsr    print
  2755. .no_break
  2756.         sf    no_curs
  2757.  
  2758.         movem.l    (a7)+,d0-d7/a0-a4
  2759.         rts
  2760.  
  2761. .crash_txt    dc.b "*** command crashed ***",$a,0
  2762.  
  2763.         cnop 0,4
  2764. cmd_sp_save    dc.l 0
  2765.  
  2766. ************************************************************
  2767.         cnop 0,4
  2768.  
  2769. ;-------------- cmds ordered by size -----------------------
  2770. ;cmd format
  2771. ;----------
  2772. ;dc.b cmd name padded with 0 (8 bytes)
  2773. ;dc.l ptr to code, ptr to line up code, ptr to line down code
  2774.  
  2775. cmd_list:    dc.b 'R',0,0,0,0,0,0,0
  2776.         dc.l cmd_r,0,0
  2777.         dc.b 'H',0,0,0,0,0,0,0
  2778.         dc.l cmd_h,cmdu_h,cmdd_h
  2779.         dc.b 'M',0,0,0,0,0,0,0
  2780.         dc.l cmd_h,cmdu_h,cmdd_h
  2781.         dc.b 'D',0,0,0,0,0,0,0
  2782.         dc.l cmd_a,cmdu_d,cmdd_d
  2783.         dc.b 'B',0,0,0,0,0,0,0
  2784.         dc.l cmd_b,0,0
  2785.         dc.b 'C',0,0,0,0,0,0,0
  2786.         dc.l cmd_c,0,0
  2787.         dc.b 'T',0,0,0,0,0,0,0
  2788.         dc.l cmd_t,0,0
  2789.         dc.b 'N',0,0,0,0,0,0,0
  2790.         dc.l cmd_n,cmdu_n,cmdd_n
  2791.         dc.b 'P',0,0,0,0,0,0,0
  2792.         dc.l cmd_p,0,0
  2793.         dc.b '?',0,0,0,0,0,0,0
  2794.         dc.l cmd_ev,0,0
  2795.         dc.b 'L',0,0,0,0,0,0,0
  2796.         dc.l cmd_l,0,0
  2797.         dc.b 'X',0,0,0,0,0,0,0
  2798.         dc.l cmd_x,0,0
  2799.         dc.b 'G',0,0,0,0,0,0,0
  2800.         dc.l cmd_g,0,0
  2801.         dc.b 'F',0,0,0,0,0,0,0
  2802.         dc.l cmd_f,0,0
  2803.         dc.b 'O',0,0,0,0,0,0,0
  2804.         dc.l cmd_o,0,0
  2805.         dc.b 'A',0,0,0,0,0,0,0
  2806.         dc.l cmd_a,0,0
  2807.         dc.b 'S',0,0,0,0,0,0,0
  2808.         dc.l cmd_s,0,0
  2809.         dc.b 'Q',0,0,0,0,0,0,0
  2810.         dc.l cmd_q,0,0
  2811.         dc.b 'E',0,0,0,0,0,0,0
  2812.         dc.l cmd_e,cmdu_e,cmdd_e
  2813.  
  2814.         dc.b 'FI',0,0,0,0,0,0
  2815.         dc.l cmd_fi,0,0
  2816.         dc.b 'RS',0,0,0,0,0,0
  2817.         dc.l cmd_disk1,0,0
  2818.         dc.b 'WS',0,0,0,0,0,0
  2819.         dc.l cmd_disk2,0,0
  2820.         dc.b 'CD',0,0,0,0,0,0
  2821.         dc.l cmd_cd,0,0
  2822.         dc.b 'DF',0,0,0,0,0,0
  2823.         dc.l cmd_df,0,0
  2824.         dc.b 'AF',0,0,0,0,0,0
  2825.         dc.l cmd_af,0,0
  2826.         dc.b 'TS',0,0,0,0,0,0
  2827.         dc.l cmd_ts,0,0
  2828.         dc.b 'TF',0,0,0,0,0,0
  2829.         dc.l cmd_tf,0,0
  2830.         dc.b 'SA',0,0,0,0,0,0
  2831.         dc.l cmd_sa,0,0
  2832.         dc.b 'LA',0,0,0,0,0,0
  2833.         dc.l cmd_la,0,0
  2834.         dc.b 'LS',0,0,0,0,0,0
  2835.         dc.l cmd_dir,0,0
  2836.         dc.b 'SP',0,0,0,0,0,0
  2837.         dc.l cmd_sp,0,0
  2838.         dc.b 'BB',0,0,0,0,0,0
  2839.         dc.l cmd_bb,0,0
  2840.         dc.b 'FS',0,0,0,0,0,0
  2841.         dc.l cmd_fs,0,0
  2842.         dc.b 'MW',0,0,0,0,0,0
  2843.         dc.l cmd_mw,0,0
  2844.  
  2845.         dc.b 'MWD',0,0,0,0,0
  2846.         dc.l cmd_mwd,0,0
  2847.         dc.b 'TSD',0,0,0,0,0
  2848.         dc.l cmd_tsd,0,0
  2849.          dc.b 'FIF',0,0,0,0,0
  2850.         dc.l cmd_fif,0,0
  2851.         dc.b 'DIR',0,0,0,0,0
  2852.         dc.l cmd_dir,0,0
  2853.         dc.b 'PAL',0,0,0,0,0
  2854.         dc.l cmd_pal,0,0
  2855.         dc.b '31K',0,0,0,0,0
  2856.         dc.l cmd_31k,0,0
  2857.         dc.b 'LED',0,0,0,0,0
  2858.         dc.l cmd_led,0,0
  2859.         dc.b 'IDE',0,0,0,0,0
  2860.         dc.l cmd_ide,0,0
  2861.         dc.b 'DEL',0,0,0,0,0
  2862.         dc.l cmd_del,0,0
  2863.         dc.b 'PWD',0,0,0,0,0
  2864.         dc.l cmd_cd,0,0
  2865.         dc.b 'D2F',0,0,0,0,0
  2866.         dc.l cmd_d2f,0,0
  2867.         dc.b 'F2D',0,0,0,0,0
  2868.         dc.l cmd_f2d,0,0
  2869.         dc.b 'VER',0,0,0,0,0
  2870.         dc.l cmd_ver,0,0
  2871.         dc.b 'SAC',0,0,0,0,0
  2872.         dc.l cmd_sac,0,0
  2873.         dc.b 'COP',0,0,0,0,0
  2874.         dc.l cmd_cop,0,0
  2875.  
  2876.         dc.b 'NTSC',0,0,0,0
  2877.         dc.l cmd_ntsc,0,0
  2878.         dc.b 'TYPE',0,0,0,0
  2879.         dc.l cmd_type,0,0
  2880.         dc.b 'COPY',0,0,0,0
  2881.         dc.l cmd_copy,0,0
  2882.         dc.b 'PART',0,0,0,0
  2883.         dc.l cmd_part,0,0
  2884.         dc.b 'KILL',0,0,0,0
  2885.         dc.l cmd_kill,0,0
  2886.  
  2887.         dc.b 'DRIVE',0,0,0
  2888.         dc.l cmd_drive,0,0
  2889.         dc.b 'DEBUG',0,0,0
  2890.         dc.l cmd_debug,0,0
  2891.         dc.b 'MOTOR',0,0,0
  2892.         dc.l cmd_motor,0,0
  2893.         dc.b 'INTEL',0,0,0
  2894.         dc.l cmd_intel,0,0
  2895.         dc.b 'EXCEP',0,0,0
  2896.         dc.l cmd_excep,0,0
  2897.         dc.b 'MKDIR',0,0,0
  2898.         dc.l cmd_makedir,0,0
  2899.         dc.b 'CLEAR',0,0,0
  2900.         dc.l cmd_clear,0,0
  2901.  
  2902.         dc.b 'REBOOT',0,0
  2903.         dc.l cmd_reboot,0,0
  2904.         dc.b 'FORMAT',0,0
  2905.         dc.l cmd_format,0,0
  2906.         dc.b 'OUTPUT',0,0
  2907.         dc.l cmd_output,0,0
  2908.         dc.b 'SETMAP',0,0
  2909.         dc.l cmd_setmap,0,0
  2910.         dc.b 'HORNET',0,0
  2911.         dc.l cmd_hornet,0,0
  2912.         dc.b 'CHKDSK',0,0
  2913.         dc.l cmd_diskchk,0,0
  2914.  
  2915.         dc.b 'FORMATQ',0
  2916.         dc.l cmd_formatq,0,0
  2917.         dc.b 'DISKCHK',0
  2918.         dc.l cmd_diskchk,0,0
  2919.         dc.b 'MAKEDIR',0
  2920.         dc.l cmd_makedir,0,0
  2921.  
  2922.         dcb.b 8,0
  2923.         dc.l 0,0,0
  2924.  
  2925. ****************************************************************
  2926.  
  2927. cmd_ver        lea.l    ver_txt(pc),a0
  2928.         bsr    print
  2929.         bra.w    end_command
  2930.  
  2931. ver_txt        dc.b "HRTmon v"
  2932.         version            ;x.yz
  2933.         dc.b $a,0
  2934.         even
  2935.  
  2936. ****************************************************************
  2937.  
  2938.         include src/copper.s
  2939.  
  2940. ****************************************************************
  2941. ;-------------- add/remove/view memory watch -------------------
  2942.  
  2943. cmd_mw        moveq    #1,d1
  2944.         cmp.b    #'.',(a0)
  2945.         bne.b    .nosize
  2946.         addq.l    #1,a0
  2947.         move.b    (a0)+,d0
  2948.         bsr    upper_case
  2949.         cmp.b    #'B',d0
  2950.         beq.b    .nosize
  2951.         moveq    #2,d1
  2952.         cmp.b    #'W',d0
  2953.         beq.b    .nosize
  2954.         moveq    #4,d1
  2955.         cmp.b    #'L',d0
  2956.         beq.b    .nosize
  2957.         lea.l    .size_txt(pc),a0
  2958.         bsr    print
  2959.         bra.w    .end
  2960.  
  2961. .nosize        move.b    d1,.tmp_size
  2962.         bsr    evaluate
  2963.         bmi.w    illegal_addr
  2964.         beq.b    .gotaddr
  2965.  
  2966. ;-------------- no param -> view all memory watch ---------
  2967.  
  2968.         lea.l    watch_size(pc),a2
  2969.         lea.l    watch_addr(pc),a1
  2970. .loop        move.b    (a2)+,d2
  2971.         beq.w    .end
  2972.  
  2973.         lea.l    .view_txt(pc),a0
  2974.         bsr    print
  2975.         move.l    (a1)+,d0
  2976.         moveq    #8,d1
  2977.         bsr    print_hex
  2978.         cmp.b    #1,d2
  2979.         bne.b    .nob
  2980.         lea.l    .viewb_txt(pc),a0
  2981.         bsr    print
  2982.         bra.b    .loop
  2983. .nob        cmp.b    #2,d2
  2984.         bne.b    .now
  2985.         lea.l    .vieww_txt(pc),a0
  2986.         bsr    print
  2987.         bra.b    .loop
  2988. .now        lea.l    .viewl_txt(pc),a0
  2989.         bsr    print
  2990.         bra.b    .loop
  2991.  
  2992. ;-------------- set/remove memory watch -------------------
  2993.  
  2994. .gotaddr    move.l    d0,a4
  2995.         lea.l    watch_addr(pc),a0
  2996.         lea.l    watch_size(pc),a1
  2997.         lea.l    watch_orig(pc),a2
  2998. .loop2        addq.l    #4,a2
  2999.         tst.b    (a1)+
  3000.         beq.b    .noremove
  3001.         cmp.l    (a0)+,a4
  3002.         bne.b    .loop2
  3003.         subq.l    #1,a1
  3004.         subq.l    #4,a0
  3005.         subq.l    #4,a2
  3006. .pack        move.l    4(a0),(a0)+
  3007.         move.l    4(a2),(a2)+
  3008.         move.b    1(a1),(a1)+
  3009.         bne.b    .pack
  3010.         lea.l    .remove_txt(pc),a0
  3011.         bsr    print
  3012.         move.l    a4,d0
  3013.         moveq    #8,d1
  3014.         bsr    print_hexCR
  3015.         and.w    #$7fff,sr_reg
  3016.         bra.b    .end
  3017.  
  3018. ;-------------- set memory watch --------------------------
  3019. .noremove    move.l    a4,d0
  3020.         btst    #0,d0
  3021.         beq.b    .okeven
  3022.         tst.w    proc_type
  3023.         bne.b    .okeven
  3024.         lea.l    .even_txt(pc),a0
  3025.         bsr    print
  3026.         bra.b    .end
  3027. .okeven
  3028.         bsr    reloc_pic
  3029.         lea.l    watch_size(pc),a0
  3030.         lea.l    watch_addr(pc),a1
  3031.         lea.l    watch_orig(pc),a2
  3032.         moveq    #MAX_WATCH-1,d0
  3033. .seek        tst.b    (a0)
  3034.         beq.b    .found_empty
  3035.         addq.l    #1,a0
  3036.         addq.l    #4,a1
  3037.         addq.l    #4,a2
  3038.         dbf    d0,.seek
  3039.         lea.l    .toomany_txt(pc),a0
  3040.         bsr    print
  3041.         bra.b    .end
  3042.  
  3043. .found_empty    move.b    .tmp_size(pc),(a0)
  3044.         move.l    a4,(a1)
  3045.         move.l    (a4),(a2)
  3046.  
  3047.         lea.l    .set_txt(pc),a0
  3048.         bsr    print
  3049.         moveq    #8,d1
  3050.         move.l    a4,d0
  3051.         bsr    print_hexCR
  3052.  
  3053. .end        bra.w    end_command
  3054.  
  3055. .tmp_size    dc.b 0
  3056.  
  3057. .size_txt    dc.b "Illegal size specifier ! (only .b .w .l allowed)",$a,0
  3058. .view_txt    dc.b "Memory watch at $",0
  3059. .viewb_txt    dc.b ".b",$a,0
  3060. .vieww_txt    dc.b ".w",$a,0
  3061. .viewl_txt    dc.b ".l",$a,0
  3062. .set_txt    dc.b "Memory watch set at $",0
  3063. .remove_txt    dc.b "Memory watch removed at $",0
  3064. .toomany_txt    dc.b "Too many memory watch !",$a,0
  3065. .even_txt    dc.b "Address must be even ! (only on 68000 processor)",$a,0
  3066.         even
  3067.  
  3068. MAX_WATCH = 16
  3069.  
  3070.         cnop 0,4
  3071. watch_addr    dcb.l MAX_WATCH+1,0    ;address to watch
  3072. watch_orig    dcb.l MAX_WATCH+1,0    ;original value in watched mem.
  3073. watch_size    dcb.b MAX_WATCH+1,0    ;watch size (1,2,4, 0=none)
  3074.  
  3075. watch_flag    dc.b 0            ;-1 when HRTmon entered by memory watch
  3076.         even
  3077. watch_trigger    dc.l 0            ;address which triggered entrance
  3078.         even
  3079.  
  3080. ****************************************************************
  3081. ;-------------- init trace mode if memory watch exists ---------
  3082.  
  3083. init_mwatch    movem.l    a0-a3,-(a7)
  3084.         tst.b    watch_size
  3085.         beq.w    .nowatch
  3086.  
  3087. ;-------------- init watch_orig ---------------
  3088.         lea.l    watch_size(pc),a0
  3089.         lea.l    watch_addr(pc),a1
  3090.         lea.l    watch_orig(pc),a2
  3091. .loop        tst.b    (a0)+
  3092.         beq.b    .end
  3093.         move.l    (a1)+,a3
  3094.         move.l    (a3),(a2)+
  3095.         bra.b    .loop
  3096. .end
  3097.         move.l    vbr_reg,a4
  3098.         or.w    #$8000,sr_reg
  3099.         move.l    $24(a4),old_trace
  3100.         move.l    #watch_entry,$24(a4)
  3101.  
  3102. .nowatch    movem.l    (a7)+,a0-a3
  3103.         rts
  3104.  
  3105. watch_entry    move.w    #$2700,sr
  3106.         movem.l    d0-d1/a0-a3,-(a7)
  3107.         lea.l    watch_size(pc),a0
  3108.         lea.l    watch_addr(pc),a1
  3109.         lea.l    watch_orig-4(pc),a2
  3110.         moveq    #0,d0
  3111. .loop        addq.l    #4,a2
  3112.         move.b    (a0)+,d0
  3113.         beq.b    .end
  3114.         move.l    (a1)+,a3
  3115.         subq.b    #1,d0
  3116.         bne.b    .nob
  3117.         move.b    (a3),d1
  3118.         cmp.b    (a2),d1
  3119.         beq.b    .loop
  3120.         bra.b    .diff
  3121. .nob        subq.b    #1,d0
  3122.         bne.b    .now
  3123.         move.w    (a3),d1
  3124.         cmp.w    (a2),d1
  3125.         beq.b    .loop
  3126.         bra.b    .diff
  3127. .now        move.l    (a3),d1
  3128.         cmp.l    (a2),d1
  3129.         beq.b    .loop
  3130.  
  3131. .diff        move.l    a3,watch_trigger
  3132.         move.l    vbr_reg,a0
  3133.         move.l    old_trace,$24(a0)
  3134.         movem.l    (a7)+,d0-d1/a0-a3
  3135.         and.w    #$7fff,(a7)
  3136.         st    watch_flag
  3137.         bra.w    monitor
  3138.  
  3139. .end        movem.l    (a7)+,d0-d1/a0-a3
  3140.         or.w    #$8000,(a7)
  3141.         rte
  3142.  
  3143. ShowWatchEntry    movem.l    d0-d1/a0,-(a7)
  3144.         tst.b    watch_flag
  3145.         beq.b    .exit
  3146.         sf    watch_flag
  3147.         lea.l    .txt(pc),a0
  3148.         bsr    print
  3149.         move.l    watch_trigger(pc),d0
  3150.         moveq    #8,d1
  3151.         bsr    print_hexCR
  3152. .exit        movem.l    (a7)+,d0-d1/a0
  3153.         rts
  3154.  
  3155. .txt        dc.b "Watched memory changed at $",0
  3156.         even
  3157.  
  3158. ****************************************************************
  3159. ;-------------- delete all memory watch  -----------------------
  3160.  
  3161. cmd_mwd        lea.l    watch_size(pc),a0
  3162.         moveq    #MAX_WATCH-1,d0
  3163. .clear        clr.b    (a0)+
  3164.         dbf    d0,.clear
  3165.         lea.l    .txt(pc),a0
  3166.         bsr    print
  3167.         bra.w    end_command
  3168.  
  3169. .txt        dc.b "All memory watch deleted",$a,0
  3170.         even
  3171.  
  3172. ****************************************************************
  3173. ;-------------- FS find string (not casesensitive) -------------
  3174.  
  3175. cmd_fs        bsr    evaluate
  3176.         bne.w    illegal_addr
  3177.         move.l    d0,find_start
  3178.         bsr    evaluate
  3179.         bne.w    illegal_addr
  3180.         move.l    d0,find_end
  3181.         movem.l    find_start,d0-d1
  3182.         cmp.l    d0,d1
  3183.         ble.w    illegal_addr
  3184.  
  3185.         lea.l    find_list,a1
  3186.         bsr    read_name
  3187.         tst.b    (a1)
  3188.         beq.w    illegal_string
  3189.  
  3190. .up        move.b    (a1),d0
  3191.         beq.b    .endlist
  3192.         bsr    upper_case
  3193.         move.b    d0,(a1)+
  3194.         bra.b    .up
  3195. .endlist
  3196.         movem.l    find_start,a0-a1
  3197.  
  3198.         lea.l    watch,a3
  3199.         move.l    a0,(a3)
  3200.  
  3201. .seek        tst.b    break
  3202.         bne.w    .endfs
  3203.         lea.l    find_list,a2
  3204.         move.b    (a2)+,d1
  3205. .next        cmp.l    a1,a0
  3206.         bge.w    .endfs
  3207.         move.l    a0,(a3)
  3208.         move.l    a0,a4
  3209.         RELOC_PIC 1
  3210.         move.b    (a4),d0
  3211.         addq.l    #1,a0
  3212.         bsr    upper_case
  3213.         cmp.b    d0,d1
  3214.         bne.w    .next
  3215.  
  3216.         move.l    a0,d7
  3217. .ok        move.b    (a2)+,d1
  3218.         beq.w    .found
  3219.         cmp.l    a1,a0
  3220.         bge.w    .endfs
  3221.         move.l    a0,a4
  3222.         RELOC_PIC 2
  3223.         addq.l    #1,a0
  3224.         move.b    (a4),d0
  3225.         bsr    upper_case
  3226.         cmp.b    d0,d1
  3227.         beq.w    .ok
  3228.         move.l    d7,a0
  3229.         bra.w    .seek
  3230.  
  3231. .found        move.l    d7,d0
  3232.         subq.l    #1,d0
  3233.         lea.l    ev_line,a0
  3234.         move.w    #$2020,8(a0)
  3235.         clr.b    10(a0)
  3236.         moveq    #8,d1
  3237.         bsr    conv_hex
  3238.         bsr    print
  3239.         move.l    d7,a0
  3240.         bra.w    .seek
  3241.  
  3242. .endfs
  3243.         tst.w    cursor_x
  3244.         beq.b    .no_CR
  3245.         lea.l    cr_txt,a0
  3246.         bsr    print
  3247. .no_CR
  3248.         bra.w    end_command
  3249.  
  3250. ****************************************************************
  3251.  
  3252. cmd_clear
  3253.         lea.l    sureclear_txt(pc),a0
  3254.         bsr    print
  3255.         bsr    get_key
  3256.         lea.l    sure2_txt(pc),a0
  3257.         bsr    print
  3258.         cmp.b    #'y',d0
  3259.         bne.b    .no
  3260.         bsr    remove_pic
  3261.         lea.l    $0.w,a0
  3262.         moveq    #0,d0
  3263.         moveq    #-1,d1
  3264. .clear        rept 8
  3265.         move.l    d0,(a0)+
  3266.         endr
  3267.         dbf    d1,.clear
  3268.         bsr    set_pic
  3269.         move.l    $f80004,a0
  3270.         subq.l    #2,a0
  3271.         move.l    a0,pc_reg
  3272.         move.w    #$2700,sr_reg
  3273.         st    escape
  3274.  
  3275. .no        bra.w    end_command
  3276.  
  3277. sureclear_txt    dc.b "All memory will be cleared and the machine will reboot!",$a
  3278.         dc.b "(You will have to reinstall HRTmon)",$a
  3279.         dc.b "Are you sure you want to continue ? (y/n)",$d,0
  3280. sure2_txt    dc.b "                                         ",$d,0
  3281.         even
  3282.  
  3283. ****************************************************************
  3284. ;-------------- SETMAP change keymap ----------------------
  3285.  
  3286. cmd_setmap    lea.l    ev_line,a1
  3287.         bsr    read_name
  3288.         tst.b    (a1)            ;keymap name given ?
  3289.         beq.w    .noset
  3290.  
  3291.         lea.l    ev_line,a0
  3292. .up        move.b    (a0),d0
  3293.         bsr    upper_case
  3294.         move.b    d0,(a0)+        ;upper-case keymap name
  3295.         tst.b    (a0)
  3296.         bne.b    .up
  3297.  
  3298.         lea.l    ev_line,a0
  3299.         cmp.l    #"USA"*256,(a0)
  3300.         bne.b    .noUSAset
  3301.         move.l    #board3,d0
  3302.         move.l    #board4,d1
  3303.         move.l    #board4a,d2
  3304.         bra.b    .set
  3305. .noUSAset    cmp.w    #"CH",(a0)
  3306.         bne.b    .noCHset
  3307.         tst.b    2(a0)
  3308.         bne.b    .noCHset
  3309.         move.l    #board1,d0
  3310.         move.l    #board2,d1
  3311.         move.l    #board2a,d2
  3312.         bra.b    .set
  3313. .noCHset    cmp.w    #"D"*256,(a0)
  3314.         bne.b    .noDset
  3315.         move.l    #board5,d0
  3316.         move.l    #board6,d1
  3317.         move.l    #board6a,d2
  3318.         bra.b    .set
  3319. .noDset        cmp.w    #"F"*256,(a0)
  3320.         bne.b    .noFset
  3321.         move.l    #board7,d0
  3322.         move.l    #board8,d1
  3323.         move.l    #board8a,d2
  3324.         bra.b    .set
  3325. .noFset
  3326.         lea.l    .maperr_txt(pc),a0
  3327.         bsr    print
  3328.         bra.b    .noset
  3329.  
  3330. .set        movem.l    d0-d2,board_ptr
  3331.  
  3332. .noset        lea.l    .key1_txt(pc),a0
  3333.         bsr    print
  3334.  
  3335.         move.l    board_ptr,d0
  3336.         cmp.l    #board3,d0
  3337.         bne.b    .noUSA
  3338.         lea.l    .key2_txt(pc),a0
  3339. .noUSA        cmp.l    #board1,d0
  3340.         bne.b    .noCH
  3341.         lea.l    .key3_txt(pc),a0
  3342. .noCH        cmp.l    #board5,d0
  3343.         bne.b    .noD
  3344.         lea.l    .key4_txt(pc),a0
  3345. .noD        cmp.l    #board7,d0
  3346.         bne.b    .noF
  3347.         lea.l    .key5_txt(pc),a0
  3348. .noF        bsr    print
  3349.  
  3350.         bra.w    end_command
  3351.  
  3352. .maperr_txt    dc.b "Illegal keymap name !",$a,0
  3353. .key1_txt    dc.b "Actual keymap is : ",0
  3354. .key2_txt    dc.b "USA",$a,0
  3355. .key3_txt    dc.b "CH",$a,0
  3356. .key4_txt    dc.b "D",$a,0
  3357. .key5_txt    dc.b "F",$a,0
  3358.         even
  3359.  
  3360. ;-------------- print exception vectors and names --------------
  3361.  
  3362. cmd_excep    moveq    #0,d2            ;first vector
  3363.         sub.l    a2,a2            ;first vector
  3364.         move.w    window_bot,d4
  3365.         sub.w    window_top,d4
  3366.         move.w    d4,d5
  3367. .loop        tst.b    break
  3368.         bne    .exit
  3369.         move.l    d2,d0
  3370.         lea    _exceptionnames,a0
  3371.         jsr    _DoStringNull
  3372.         move.l    d0,d3
  3373.         beq    .next
  3374.  
  3375.         lea    .t1,a0
  3376.         bsr    print
  3377.         move.l    (a2),d0
  3378.         moveq    #8,d1
  3379.         bsr    print_hex
  3380.         lea    .t2,a0
  3381.         bsr    print
  3382.         move.l    a2,d0
  3383.         moveq    #2,d1
  3384.         bsr    print_hex
  3385.         lea    .t3,a0
  3386.         bsr    print
  3387.         move.l    d3,a0
  3388.         bsr    print
  3389.         jsr    _PrintLn
  3390.  
  3391.         subq.w    #1,d4
  3392.         bne    .next
  3393.         move.w    d5,d4
  3394.         bsr    get_key
  3395.  
  3396. .next        addq.w    #1,d2
  3397.         addq.l    #4,a2
  3398.         cmp.w    #64,d2
  3399.         bne    .loop
  3400.  
  3401. .exit        bra.w    end_command
  3402.  
  3403. .t2        dc.b    " : "
  3404. .t1        dc.b    "$",0
  3405. .t3        dc.b    " ",0
  3406.         even
  3407.  
  3408. ;-------------- disk to file -----------------------------------
  3409. ;-------------- read a whole disk and save it as a file --------
  3410.  
  3411. cmd_d2f
  3412.         lea.l    ev_line,a1
  3413.         bsr    read_name
  3414.         tst.b    (a1)
  3415.         beq.w    illegal_name
  3416.  
  3417.         bsr    test_present
  3418.         bne.w    .error
  3419.  
  3420.         move.l    #ev_line,d1
  3421.         moveq    #-1,d2        ;create new file
  3422.         bsr    open_file
  3423.         move.l    d0,d7
  3424.         beq.b    .error
  3425.  
  3426.         move.w    #-1,ts_size        ;trainer buffer cleared
  3427.  
  3428.         moveq    #0,d5
  3429.         move.w    #160-1,d6
  3430. .next        move.l    #tmp_mem,a0
  3431.         move.l    d5,d0
  3432.         moveq    #11,d1
  3433.         bsr    read2
  3434.         bne.b    .error
  3435.         add.l    d1,d5
  3436.         move.l    d7,d1
  3437.         move.l    #tmp_mem,d2
  3438.         move.l    #512*11,d3
  3439.         bsr    write_file
  3440.         bne.b    .error
  3441.         tst.b    break
  3442.         bne.b    .close
  3443.         dbf    d6,.next
  3444.  
  3445. .close        move.l    d7,d1
  3446.         bsr    close_file
  3447. .error
  3448.  
  3449.         bra.w    end_command
  3450.  
  3451.  
  3452. ;-------------- file to disk -----------------------------------
  3453. ;-------------- read a file and write it to disk ---------------
  3454.  
  3455. cmd_f2d        lea.l    ev_line,a1
  3456.         bsr    read_name
  3457.         tst.b    (a1)
  3458.         beq.w    illegal_name
  3459.  
  3460.         bsr    test_present
  3461.         bne.w    .error
  3462.  
  3463.         move.l    #ev_line,d1
  3464.         moveq    #0,d2        ;open old file
  3465.         bsr    open_file
  3466.         move.l    d0,d7
  3467.         beq.w    .error
  3468.         move.l    d7,a0
  3469.         cmp.l    #80*22*512,file_size(a0)
  3470.         beq.b    .oksize
  3471.         lea.l    sizeErr_txt(pc),a0
  3472.         bsr    print
  3473.         bra.b    .error
  3474.  
  3475. .oksize
  3476.  
  3477.         move.w    #-1,ts_size        ;trainer buffer cleared
  3478.  
  3479.         moveq    #0,d5
  3480.         move.w    #160-1,d6
  3481. .next        move.l    d7,d1
  3482.         move.l    #tmp_mem,d2
  3483.         move.l    #512*11,d3
  3484.         bsr    read_file
  3485.         bne.b    .error
  3486.         move.l    #tmp_mem,a0
  3487.         move.l    d5,d0
  3488.         moveq    #11,d1
  3489.         bsr    write2
  3490.         bne.b    .error
  3491.         add.l    d1,d5
  3492.         tst.b    break
  3493.         bne.b    .close
  3494.         dbf    d6,.next
  3495.  
  3496. .close        move.l    d7,d1
  3497.         bsr    close_file
  3498. .error
  3499.  
  3500.         bra.w    end_command
  3501.  
  3502. sizeErr_txt    dc.b "Wrong file size !",$a,0
  3503.         even
  3504.  
  3505. ;-------------- show custom registers --------------------------
  3506.  
  3507. cmd_e        bsr    evaluate
  3508.         bne.b    .no_offset
  3509.         cmp.l    #$200,d0
  3510.         bge.w    illegal_addr
  3511.         btst    #0,d0
  3512.         bne.w    illegal_addr
  3513.         move.l    d0,custom_offset
  3514.         move.l    d0,d3
  3515.         bsr    evaluate        ;edit ?
  3516.         bne.b    .no_offset
  3517.         lea.l    custom,a3
  3518.         move.w    d0,(a3,d3.l)
  3519.         bra.w    end_command
  3520.  
  3521. .no_offset    move.l    custom_offset,d5
  3522.         moveq    #8-1,d7            ;print 8 lines
  3523. .loop        cmp.l    #$200,d5
  3524.         bge.b    .noprint
  3525.  
  3526.         bsr    make_e_line
  3527.  
  3528.         addq.l    #2,d5
  3529.         lea.l    general_txt,a0
  3530.         bsr    print
  3531.         dbf    d7,.loop
  3532.  
  3533. .noprint    move.l    d5,custom_offset
  3534.  
  3535.         bra.w    end_command
  3536.  
  3537. ;-> d5=offset
  3538. ;<- general_txt filled with e_line
  3539. make_e_line    movem.l    d0-a4,-(a7)
  3540.         lea.l    custom_names,a2
  3541.         lea.l    custom,a3
  3542.         lea.l    general_txt,a0
  3543.         move.w    #"e ",(a0)+
  3544.         move.b    #"$",(a0)+
  3545.         moveq    #3,d1
  3546.         move.w    d5,d0
  3547.         bsr    conv_hex        ;print offset
  3548.         add.l    d1,a0
  3549.         move.w    #" $",(a0)+
  3550.         move.w    (a3,d5.w),d0
  3551.         moveq    #4,d1
  3552.         bsr    conv_hex        ;print register value
  3553.         add.l    d1,a0
  3554.         move.l    #"  ; ",(a0)+
  3555.         lsl.w    #2,d5
  3556.         lea.l    (a2,d5.w),a4
  3557.         move.l    (a4)+,(a0)+
  3558.         move.l    (a4)+,(a0)+
  3559.         move.w    #$0a00,(a0)+
  3560.         movem.l    (a7)+,d0-a4
  3561.         rts
  3562.  
  3563. ;-------------- scroll up e_line -----------
  3564.  
  3565. cmdu_e        move.l    ascII_ptr,a0
  3566.         lea.l    80(a0),a0
  3567.         cmp.w    #'e ',(a0)    ;last top line was an e_line ?
  3568.         bne.b    .noe
  3569.         addq.l    #2,a0
  3570.         bsr    evaluate    ;get last offset
  3571.         subq.l    #2,d0
  3572.         bmi.b    .noe
  3573.  
  3574.         move.l    d0,d5
  3575.         bsr.b    make_e_line
  3576.  
  3577.         lea.l    general_txt,a0
  3578.         bsr    print
  3579.         subq.w    #1,(2,a3)    ;cursor one line up
  3580.  
  3581.         moveq    #0,d0
  3582.  
  3583. .noe        rts
  3584.  
  3585. ;-------------- scroll down e_line ---------
  3586.  
  3587. cmdd_e        move.l    ascII_ptr,a0
  3588.         move.l    d0,-(a7)
  3589.         move.w    window_bot,d0
  3590.         subq.w    #2,d0
  3591.         mulu    #80,d0
  3592.         add.l    d0,a0
  3593.         move.l    (a7)+,d0
  3594.         cmp.w    #'e ',(a0)    ;last line was an e_line ?
  3595.         bne.b    .noe
  3596.         addq.l    #2,a0
  3597.         bsr    evaluate    ;get last address
  3598.         addq.l    #2,d0
  3599.         cmp.l    #$200,d0
  3600.         bge.b    .noe
  3601.  
  3602.         move.l    d0,d5
  3603.         bsr    make_e_line
  3604.  
  3605.         addq.l    #2,d5
  3606.         move.l    d5,custom_offset
  3607.  
  3608.         subq.w    #1,(2,a3)        ;cursor one line up
  3609.         lea.l    general_txt,a0
  3610.         bsr    print
  3611.  
  3612.         moveq    #0,d0
  3613.  
  3614. .noe        rts
  3615.  
  3616.  
  3617. ;-------------- delete a file or an empty dir ------------------
  3618.  
  3619. cmd_del        lea.l    ev_line,a1
  3620.         bsr    read_name        ;get source name
  3621.         tst.b    (a1)
  3622.         beq.w    illegal_name
  3623.  
  3624.         move.l    #ev_line,d1
  3625.         bsr    delete_file
  3626.  
  3627.         bra.w    end_command
  3628.  
  3629. ;-------------- get partition info -----------------------------
  3630.  
  3631. cmd_part
  3632.  
  3633.         move.l    #floppy0,d0
  3634.  
  3635.         lea.l    part_txt(pc),a0
  3636.         bsr    print
  3637.  
  3638. .next        move.l    d0,a4
  3639.  
  3640.  
  3641.         lea.l    part_name(a4),a0
  3642.         lea.l    general_txt,a1
  3643.         move.l    a1,a2
  3644.         moveq    #8-1,d0
  3645. .fill        move.l    #"    ",(a2)+
  3646.         dbf    d0,.fill
  3647.  
  3648.         moveq    #0,d0
  3649.         move.b    (a0)+,d0
  3650.         bra.b    .godbf
  3651. .copy        move.b    (a0)+,(a1)+        ;copy name
  3652. .godbf        dbf    d0,.copy
  3653.         lea.l    part2_txt(pc),a0
  3654.         bsr    print
  3655.         lea.l    general_txt,a0
  3656.         sf    16(a0)
  3657.         bsr    print            ;print name
  3658.  
  3659.         lea.l    part3_txt(pc),a0
  3660.         cmp.l    #ide_device,part_device(a4)
  3661.         beq.b    .ide
  3662.         lea.l    part4_txt(pc),a0
  3663. .ide        bsr    print            ;device
  3664.  
  3665.         move.l    part_first(a4),d0
  3666.         moveq    #8,d1
  3667.         bsr    print_dec
  3668.  
  3669.         lea.l    part5_txt(pc),a0
  3670.         bsr    print
  3671.  
  3672.         move.l    part_nbsec(a4),d0
  3673.         moveq    #8,d1
  3674.         bsr    print_decCR
  3675.  
  3676.         move.l    part_next(a4),d0
  3677.         bne.b    .next
  3678.  
  3679.         bra.w    end_command
  3680.  
  3681. part_txt
  3682.  dc.b "--- Name ----------- -- Device -- -- First Block ----- -- NbBlocks --------",$a,0
  3683.  
  3684. part2_txt    dc.b "     ",0
  3685. part5_txt    dcb.b 11,$20
  3686.         dc.b 0
  3687.  
  3688. part3_txt    dc.b "    IDE       ",0
  3689. part4_txt    dc.b "    Floppy    ",0
  3690.         even
  3691.  
  3692. ;-------------- get info from IDE drives -----------------------
  3693.  
  3694. cmd_ide        tst.b    config_IDE
  3695.         bne.b    .goide
  3696.         lea.l    .noide_txt(pc),a0
  3697.         bsr    print
  3698.         bra.w    end_command
  3699. .goide        tst.b    config_elsat
  3700.         beq.b    .nocd32
  3701.         lea.l    .cd32_txt(pc),a0
  3702.         bsr    print
  3703.         bra.b    .cont
  3704. .nocd32        tst.b    config_A1200
  3705.         beq.b    .go4000
  3706.         lea.l    .a1200_txt(pc),a0
  3707.         bsr    print
  3708.         bra.b    .cont
  3709. .go4000        lea.l    .a4000_txt(pc),a0
  3710.         bsr    print
  3711.  
  3712. .cont        lea.l    secbuf,a0
  3713.         tst.w    IDE_info0
  3714.         beq.b    .nodrive0
  3715.         moveq    #0,d1        ;drive no 0
  3716.         bsr    Read_ID
  3717.         bne.b    .nodrive0
  3718.         lea.l    ide1_txt(pc),a0
  3719.         bsr    print
  3720.         bsr    .print_info
  3721.         bra.b    .okdrive0
  3722. .nodrive0    lea.l    ide2_txt(pc),a0
  3723.         bsr    print
  3724.  
  3725. .okdrive0    lea.l    secbuf,a0
  3726.         tst.w    IDE_info1
  3727.         beq.b    .nodrive1
  3728.         moveq    #1,d1        ;drive no 1
  3729.         bsr    Read_ID
  3730.         bne.b    .nodrive1
  3731.         lea.l    ide3_txt(pc),a0
  3732.         bsr    print
  3733.         bsr    .print_info
  3734.         bra.b    .okdrive1
  3735. .nodrive1    lea.l    ide4_txt(pc),a0
  3736.         bsr    print
  3737.  
  3738. .okdrive1    moveq    #0,d0
  3739.         moveq    #0,d1
  3740.         tst.w    IDE_info0
  3741.         beq.b    .no0
  3742.         lea.l    secbuf,a0
  3743.         bsr    Read_Block
  3744. .no0
  3745.         bra.w    end_command
  3746.  
  3747. .noide_txt    dc.b "No IDE interface",$a,0
  3748. .cd32_txt    dc.b "ELSAT CD32 Pro Module IDE interface",$a,0
  3749. .a1200_txt    dc.b "Gayle A1200 IDE interface",$a,0
  3750. .a4000_txt    dc.b "Gayle A4000 IDE interface",$a,0
  3751.         even
  3752.  
  3753. .print_info    lea.l    secbuf,a4
  3754.         lea.l    ide5_txt(pc),a0
  3755.         bsr    print
  3756.         lea.l    27*2(a4),a0
  3757.         move.w    #$0a00,46*2(a4)
  3758.         tst.w    (a0)
  3759.         bne.b    .okname
  3760.         lea.l    ide10_txt(pc),a0
  3761. .okname        bsr    print            ;name
  3762.  
  3763.         lea.l    ide6_txt(pc),a0
  3764.         bsr    print
  3765.         lea.l    10*2(a4),a0
  3766.         move.w    #$0a00,19*2(a4)
  3767.         tst.w    (a0)
  3768.         bne.b    .okser
  3769.         lea.l    ide10_txt(pc),a0
  3770. .okser        cmp.b    #$20,(a0)+
  3771.         beq.b    .okser
  3772.         subq.l    #1,a0
  3773.         move.l    a0,a1
  3774. .seeke        tst.b    (a1)+
  3775.         bne.b    .seeke
  3776.         move.b    #$a,-2(a1)
  3777.         bsr    print            ;serial
  3778.  
  3779.         lea.l    ide7_txt(pc),a0
  3780.         bsr    print
  3781.         move.w    1*2(a4),d0
  3782.         moveq    #4,d1
  3783.         bsr    print_decCR        ;cylinders
  3784.  
  3785.         lea.l    ide8_txt(pc),a0
  3786.         bsr    print
  3787.         move.w    3*2(a4),d0
  3788.         moveq    #4,d1
  3789.         bsr    print_decCR        ;heads
  3790.  
  3791.         lea.l    ide9_txt(pc),a0
  3792.         bsr    print
  3793.         move.w    6*2(a4),d0
  3794.         moveq    #4,d1
  3795.         bsr    print_decCR        ;sectors
  3796.  
  3797.         lea.l    ide11_txt(pc),a0
  3798.         bsr    print
  3799.         moveq    #5,d1
  3800.         move.w    3*2(a4),d0
  3801.         mulu    6*2(a4),d0        ;sec*heads
  3802.         mulu    1*2(a4),d0        ;cyl*sec*heads
  3803.         moveq    #11,d1
  3804.         lsr.l    d1,d0
  3805.         moveq    #4,d1
  3806.         bsr    print_dec
  3807.         lea.l    ide12_txt(pc),a0
  3808.         bsr    print
  3809.  
  3810.         rts
  3811.  
  3812. ide1_txt    dc.b "-- Drive 0   : present",$a,0
  3813. ide2_txt    dc.b "-- Drive 0   : absent",$a,0
  3814. ide3_txt    dc.b "-- Drive 1   : present",$a,0
  3815. ide4_txt    dc.b "-- Drive 1   : absent",$a,0
  3816. ide5_txt    dc.b "   Name      : ",0
  3817. ide6_txt    dc.b "   Serial no : ",0
  3818. ide7_txt    dc.b "   Cylinders : ",0
  3819. ide8_txt    dc.b "   Heads     : ",0
  3820. ide9_txt    dc.b "   Sectors   : ",0
  3821. ide10_txt    dc.b "N/A",$a,0
  3822. ide11_txt    dc.b "   Capacity  : ",0
  3823. ide12_txt    dc.b "(MB)",$a,0
  3824.         even
  3825.  
  3826. ;-------------- COPY --------------------------------------
  3827.  
  3828. cmd_copy
  3829.         lea.l    ev_line,a1
  3830.         bsr    read_name        ;get source name
  3831.         tst.b    (a1)
  3832.         beq.w    illegal_name
  3833.         lea.l    general_txt,a1
  3834.         bsr    read_name        ;get dest name
  3835.         tst.b    (a1)
  3836.         beq.w    illegal_name
  3837.  
  3838.         bsr    remove_pic
  3839.  
  3840.         moveq    #0,d6
  3841.         moveq    #0,d7
  3842.         move.l    #ev_line,d1
  3843.         moveq    #0,d2
  3844.         bsr    open_file
  3845.         move.l    d0,d6
  3846.         beq.w    .err
  3847.         move.l    #general_txt,d1
  3848.         moveq    #-1,d2
  3849.         bsr    open_file
  3850.         move.l    d0,d7
  3851.         bne.b    .okdest
  3852.  
  3853.         cmp.w    #FILEEXIST_ERR,drive_err
  3854.         bne.w    .err        ;got only path without filename ?
  3855.         clr.w    drive_err
  3856.         lea.l    general_txt,a0
  3857. .seek        tst.b    (a0)+
  3858.         bne.b    .seek
  3859.         subq.l    #1,a0
  3860.         cmp.b    #':',-1(a0)
  3861.         beq.b    .noslash
  3862.         move.b    #'/',(a0)+
  3863. .noslash    move.l    d6,a1
  3864.         lea.l    file_name(a1),a1
  3865.         moveq    #0,d0
  3866.         move.b    (a1)+,d0
  3867.         bra.b    .godbf
  3868. .addname    move.b    (a1)+,(a0)+    ;add filename to dest
  3869. .godbf        dbf    d0,.addname
  3870.         sf    (a0)
  3871.  
  3872.         move.l    #general_txt,d1
  3873.         moveq    #-1,d2
  3874.         bsr    open_file    ;retry with filename
  3875.         move.l    d0,d7
  3876.         beq.b    .err
  3877. .okdest
  3878.  
  3879.         move.l    d6,a0
  3880.         move.l    file_size(a0),d5
  3881.         beq.b    .err
  3882.  
  3883.         move.w    #-1,ts_size        ;trainer buffer cleared
  3884.  
  3885. .nextblock    move.l    #tmp_mem_size,d3
  3886.         cmp.l    d3,d5
  3887.         bge.b    .okd5
  3888.         move.l    d5,d3
  3889. .okd5        sub.l    d3,d5
  3890.  
  3891.         move.l    d6,d1
  3892.         move.l    #tmp_mem,d2
  3893.         bsr    read_file
  3894.         tst.l    d0
  3895.         bne.b    .err
  3896.  
  3897.         move.l    d7,d1
  3898.         bsr    write_file
  3899.         tst.l    d0
  3900.         bne.b    .err
  3901.  
  3902.         tst.l    d5
  3903.         bne.b    .nextblock
  3904.  
  3905. .err        move.l    d6,d1
  3906.         beq.b    .noclose1
  3907.         bsr    close_file
  3908. .noclose1    move.l    d7,d1
  3909.         beq.b    .noclose2
  3910.         bsr    close_file
  3911. .noclose2
  3912.         bsr    set_pic
  3913.  
  3914.         bra.w    end_command
  3915.  
  3916. ;-------------- OUTPUT ------------------------------------
  3917.  
  3918. cmd_output    bsr    evaluate
  3919.         bne.b    .end
  3920.         tst.l    d0
  3921.         beq.b    .end
  3922.         move.l    d0,output_ptr
  3923.         move.l    d0,output_start
  3924. ;        move.l    d0,watch2
  3925.  
  3926.         bra.b    .out
  3927.  
  3928. .end        move.l    output_ptr,d2
  3929.         move.l    output_start,d0
  3930.         clr.l    output_ptr
  3931.         clr.l    output_start
  3932.  
  3933.         lea.l    endout_txt,a0
  3934.         bsr    print
  3935.         moveq    #8,d1
  3936.         bsr    print_hex        ;output_start
  3937.         lea.l    endout2_txt,a0
  3938.         bsr    print
  3939.         move.l    d2,d0            ;output_ptr
  3940.         bsr    print_hexCR
  3941.  
  3942. .out        bra.w    end_command
  3943.  
  3944. endout_txt    dc.b "Output memory from $",0
  3945. endout2_txt    dc.b " to $",0
  3946.         cnop 0,4
  3947.  
  3948. ;-------------- Q (compare memory) ------------------------
  3949.  
  3950. cmd_q        bsr    evaluate
  3951.         bne.w    illegal_addr
  3952.         move.l    d0,cmp_start
  3953.         bsr    evaluate
  3954.         bne.w    illegal_addr
  3955.         move.l    d0,cmp_end
  3956.         sub.l    cmp_start,d0
  3957.         ble.w    illegal_addr
  3958.         bsr    evaluate
  3959.         bne.w    illegal_addr
  3960.         move.l    d0,cmp_dest
  3961.  
  3962.         bsr    remove_pic
  3963.         moveq    #0,d0
  3964.         move.l    d0,$180(a6)
  3965.  
  3966.         move.l    cmp_start,a0
  3967.         move.l    cmp_dest,a1
  3968.         move.l    cmp_end,a2
  3969.         moveq    #-1,d0
  3970.  
  3971. .ok        cmp.l    a2,a0
  3972.         bge.b    .end_cmp
  3973.         cmpm.b    (a0)+,(a1)+
  3974.         beq.b    .ok
  3975.         move.l    a0,d0
  3976.         subq.l    #1,d0
  3977. .end_cmp
  3978.         bsr    set_pic
  3979.  
  3980.         moveq    #-1,d1
  3981.         cmp.l    d1,d0
  3982.         beq.b    .equal
  3983.  
  3984.         moveq    #8,d1
  3985.         bsr    print_hexCR
  3986.         bra.b    .out
  3987. .equal
  3988.         lea.l    equal_txt,a0
  3989.         bsr    print
  3990. .out
  3991.         bra.w    end_command
  3992.  
  3993. equal_txt    dc.b "Equal areas.",$a,0
  3994.         even
  3995.  
  3996. ;-------------- A -----------------------------------------
  3997.  
  3998. cmd_a        move.l    a0,a3
  3999.         bsr    evaluate
  4000.         bne.b    .godisas
  4001.         btst    #0,d0
  4002.         bne.w    illegal_addr
  4003.         move.l    d0,a1
  4004.         move.l    a1,ass_addr
  4005. .skip        cmp.b    #$20,(a0)+
  4006.         beq.b    .skip
  4007.         subq.l    #1,a0
  4008.         tst.b    (a0)
  4009.         bne.b    .goas
  4010. .godisas    move.l    a3,a0
  4011.         bra.w    cmd_d
  4012.  
  4013. .goas        jsr    assemble
  4014.         tst.l    d0
  4015.         bne.w    illegal_syntax
  4016.  
  4017. .ok        lea.l    op68000,a0
  4018.         move.l    ass_addr,a4
  4019.         bsr    reloc_pic
  4020.         move.w    oplen,d0
  4021. .copy        move.w    (a0)+,(a4)+
  4022.         dbf    d0,.copy
  4023.  
  4024.         moveq    #8,d1
  4025.         move.l    ass_addr,d0
  4026.         moveq    #0,d2
  4027.         move.w    oplen,d2
  4028.         add.w    d2,d2
  4029.         addq.l    #2,d2
  4030.         add.l    d2,d0
  4031.  
  4032.         lea.l    new_ass(pc),a0
  4033.         bsr    print
  4034.         bsr    print_hex
  4035.         lea.l    new_ass2(pc),a0
  4036.         bsr    print
  4037.         bra.w    end_command
  4038.  
  4039. new_ass        dc.b "a $",0
  4040. new_ass2    dc.b " ",0
  4041.         cnop 0,4
  4042.  
  4043. ;-------------- O -----------------------------------------
  4044. ;fill memory
  4045. cmd_o        bsr    evaluate
  4046.         bne.w    illegal_addr
  4047.         move.l    d0,fill_start
  4048.         move.l    d0,d1
  4049.         bsr    evaluate
  4050.         bne.w    illegal_addr
  4051.         move.l    d0,fill_end
  4052.         sub.l    d1,d0
  4053.         ble.w    illegal_addr
  4054.  
  4055.         clr.w    eval_size        ;.b par default
  4056.         bsr    evaluate
  4057.  
  4058.         bsr    remove_pic
  4059.         movem.l    fill_start,a0-a1
  4060.         move.w    eval_size,d1
  4061.         cmp.w    #3,d1
  4062.         beq.b    .fillL
  4063.         cmp.w    #1,d1
  4064.         beq.b    .fillW
  4065. .fillb        move.b    d0,(a0)+
  4066.         cmp.l    a1,a0
  4067.         blt.b    .fillb
  4068.         bra.b    .out
  4069. .fillW        move.w    d0,(a0)+
  4070.         cmp.l    a1,a0
  4071.         blt.b    .fillW
  4072.         bra.b    .out
  4073. .fillL        move.l    d0,(a0)+
  4074.         cmp.l    a1,a0
  4075.         blt.b    .fillL
  4076.  
  4077.  
  4078. .out        bsr    set_pic
  4079.  
  4080.         bra.w    end_command
  4081.  
  4082. ;-------------- Switch led --------------------------------
  4083.  
  4084. cmd_led        bchg    #1,$bfe001
  4085.         bchg    #1,CIAA+0
  4086.         bra.w    end_command
  4087.  
  4088. ;-------------- PAL/NTSC ----------------------------------
  4089.  
  4090. cmd_pal        clr.l    OldRaster
  4091.         move.w    #$20,custom+$1dc
  4092.         bra.w    end_command
  4093. cmd_ntsc    clr.l    OldRaster
  4094.         move.w    #0,custom+$1dc
  4095.         bra.w    end_command
  4096.  
  4097. cmd_31k        clr.l    OldRaster
  4098.         move.w    #$3a0,custom+$1dc
  4099.         bra.w    end_command
  4100.  
  4101. ;-------------- S (SAVEFILE) ------------------------------
  4102.  
  4103. cmd_s
  4104.         lea.l    ev_line,a1
  4105.         bsr.w    read_name
  4106.         tst.b    (a1)
  4107.         beq.w    illegal_name
  4108.         bsr    evaluate
  4109.         bne.w    illegal_addr
  4110.         bne.w    illegal_addr
  4111.         move.l    d0,d4            ;d4=save start
  4112.         bsr    evaluate
  4113.         bne.w    illegal_addr
  4114.         bne.w    illegal_addr
  4115.         move.l    d0,d3            ;d3=save end
  4116.         move.l    d0,d1
  4117.         move.l    d4,d0
  4118.         sub.l    d4,d3            ;d3=save len
  4119.         ble.w    illegal_addr        ;end must be > start
  4120.  
  4121.         bsr    remove_pic
  4122.  
  4123.         move.l    #ev_line,d1        ;ptr on filename
  4124.         moveq    #-1,d2            ;mode create
  4125.         bsr    open_file
  4126.         move.l    d0,d7
  4127.         beq.b    .err
  4128.  
  4129.         move.l    d4,d2
  4130.         move.l    d7,d1
  4131.         bsr    write_file        ;save mem
  4132.  
  4133.         move.l    d7,d1
  4134.         bsr    close_file
  4135.  
  4136. .err        bsr    set_pic
  4137.  
  4138.         bra.w    end_command
  4139.  
  4140.  
  4141. ;-------------- MAKEDIR -----------------------------------
  4142.  
  4143. cmd_makedir    lea.l    ev_line,a1
  4144.         bsr.w    read_name
  4145.         tst.b    (a1)
  4146.         beq.w    illegal_name
  4147.  
  4148.         move.l    #ev_line,d1
  4149.         bsr    create_dir
  4150.  
  4151.         bra.w    end_command
  4152.  
  4153. ;-------------- SA ----------------------------------------
  4154. ;-------------- save the actual state in a file -----------
  4155.  
  4156. cmd_sa
  4157.         lea.l    ev_line,a1
  4158.         bsr.w    read_name
  4159.         tst.b    (a1)
  4160.         beq.w    illegal_name
  4161.  
  4162.         sub.l    a0,a0
  4163.         move.l    max_chip,a1
  4164.         bsr    search_cop
  4165.  
  4166.         move.w    drive,-(a7)
  4167.         moveq    #3,d4            ;first drive SEL (drive0)
  4168.         lea.l    drive_present,a3
  4169.         moveq    #4-1,d5            ;4 drives
  4170. .loopd        tst.b    (a3)+
  4171.         beq.b    .nodrive
  4172.         move.w    d4,drive        ;get
  4173.         bsr    inittete        ;floppy drive head pos
  4174. .nodrive    addq.w    #1,d4
  4175.         dbf    d5,.loopd
  4176.         move.w    (a7)+,drive
  4177.  
  4178.         bsr    remove_pic
  4179.  
  4180.         move.l    #ev_line,d1        ;ptr on filename
  4181.         moveq    #-1,d2            ;mode create
  4182.         bsr    open_file
  4183.         move.l    d0,d7
  4184.         beq.w    .err
  4185.  
  4186.         move.w    #-1,ts_size        ;trainer buffer cleared
  4187.  
  4188.         lea.l    tmp_mem,a4
  4189.         move.l    #"ARSV",(a4)
  4190.  
  4191.         move.l    d7,d1
  4192.         move.l    a4,d2
  4193.         moveq    #4,d3
  4194.         bsr    write_file        ;save header 'ARSV'
  4195.         bne.w    .err
  4196.  
  4197.         move.l    d7,d1
  4198.         move.l    #registres,d2
  4199.         move.l    #end_registres-registres,d3
  4200.         bsr    write_file        ;save registers
  4201.         bne.w    .err
  4202.  
  4203.         move.l    d7,d1
  4204.         move.l    #custom,d2
  4205.         move.l    #$200,d3
  4206.         bsr    write_file        ;save custom registers
  4207.         bne.w    .err
  4208.  
  4209.         move.l    d7,d1
  4210.         move.l    #palette,d2
  4211.         move.l    #256*4,d3
  4212.         bsr    write_file        ;save palette
  4213.         bne.w    .err
  4214.  
  4215.         move.l    d7,d1
  4216.         move.l    #CIAA,d2
  4217.         moveq    #32,d3
  4218.         bsr    write_file        ;save CIA registers
  4219.         bne.w    .err
  4220.  
  4221.         move.l    d7,d1
  4222.         move.l    #old_head,d2
  4223.         moveq    #4*2,d3
  4224.         bsr    write_file        ;write head pos of drives
  4225.         bne.w    .err
  4226.  
  4227.         move.l    d7,a0
  4228.         move.l    file_part(a0),a0
  4229.         cmp.l    #floppy_device,part_device(a0)
  4230.         bne.w    .goHD
  4231.  
  4232. ;-------------- floppy save routine ----------------
  4233.         move.l    d7,d1
  4234.         moveq    #0,d2
  4235.         move.l    #$CD000,d3
  4236.         bsr    write_file        ;write data on Disk1
  4237.         bne.w    .err
  4238.         move.l    d7,d1
  4239.         bsr    close_file
  4240.  
  4241.         bsr    flush_fbuffer
  4242.         bsr    force_change
  4243.  
  4244.         bsr    set_pic
  4245.         lea.l    disk2_txt(pc),a0
  4246.         bsr    print
  4247.         bsr    get_key
  4248.         lea.l    diskclr_txt(pc),a0
  4249.         bsr    print
  4250.         bsr    remove_pic
  4251.         tst.b    break
  4252.         bne.w    .err
  4253.  
  4254.         move.l    #ev_line,d1        ;ptr on filename
  4255.         moveq    #-1,d2            ;mode create
  4256.         bsr    open_file
  4257.         move.l    d0,d7
  4258.         beq.w    .err
  4259.  
  4260.         lea.l    tmp_mem,a4
  4261.         move.l    #"ARS2",(a4)
  4262.         move.l    d7,d1
  4263.         move.l    a4,d2
  4264.         moveq    #4,d3
  4265.         bsr    write_file
  4266.         bne.w    .err
  4267.  
  4268.         move.l    d7,d1
  4269.         move.l    #$CD000,d2
  4270.         move.l    d2,d3
  4271.         bsr    write_file        ;write data on Disk2
  4272.         bne.w    .err
  4273.         move.l    d7,d1
  4274.         bsr    close_file
  4275.  
  4276.         bsr    flush_fbuffer
  4277.         bsr    force_change
  4278.  
  4279.         bsr    set_pic
  4280.         lea.l    disk3_txt(pc),a0
  4281.         bsr    print
  4282.         bsr    get_key
  4283.         lea.l    diskclr_txt(pc),a0
  4284.         bsr    print
  4285.         bsr    remove_pic
  4286.         tst.b    break
  4287.         bne.b    .err
  4288.  
  4289.         move.l    #ev_line,d1        ;ptr on filename
  4290.         moveq    #-1,d2            ;mode create
  4291.         bsr    open_file
  4292.         move.l    d0,d7
  4293.         beq.b    .err
  4294.  
  4295.         lea.l    tmp_mem,a4
  4296.         move.l    #"ARS3",(a4)
  4297.         move.l    d7,d1
  4298.         move.l    a4,d2
  4299.         moveq    #4,d3
  4300.         bsr    write_file
  4301.         bne.b    .err
  4302.  
  4303.         move.l    d7,d1
  4304.         move.l    #$CD000*2,d2
  4305.         move.l    #$200000-$CD000*2,d3
  4306.         bsr    write_file        ;write data on Disk3
  4307.         bne.b    .err
  4308.         bra.b    .endsave
  4309.  
  4310. .goHD        move.l    d7,d1
  4311.         moveq    #0,d2
  4312.         move.l    #$200000,d3
  4313.         bsr    write_file        ;save all CHIPMEM
  4314.         bne.b    .err
  4315.  
  4316. .endsave    move.l    d7,d1
  4317.         bsr    close_file
  4318.  
  4319. .err        bsr    set_pic
  4320.  
  4321.         bra.w    end_command
  4322.  
  4323.  
  4324. disk1_txt    dc.b "Please insert disk 1 and press any key.",$d,0
  4325. disk2_txt    dc.b "Please insert disk 2 and press any key.",$d,0
  4326. disk3_txt    dc.b "Please insert disk 3 and press any key.",$d,0
  4327. diskclr_txt    dc.b "                                                   ",$d,0
  4328.         even
  4329.  
  4330.  
  4331. ;-------------- SAC ---------------------------------------
  4332. ;-------------- save the actual state in a file compressed
  4333.  
  4334. cmd_sac
  4335.         lea.l    ev_line,a1
  4336.         bsr.w    read_name
  4337.         tst.b    (a1)
  4338.         beq.w    illegal_name
  4339.  
  4340.         sub.l    a0,a0
  4341.         move.l    max_chip,a1
  4342.         bsr    search_cop
  4343.  
  4344.         move.w    drive,-(a7)
  4345.         moveq    #3,d4            ;first drive SEL (drive0)
  4346.         lea.l    drive_present,a3
  4347.         moveq    #4-1,d5            ;4 drives
  4348. .loopd        tst.b    (a3)+
  4349.         beq.b    .nodrive
  4350.         move.w    d4,drive        ;get
  4351.         bsr    inittete        ;floppy drive head pos
  4352. .nodrive    addq.w    #1,d4
  4353.         dbf    d5,.loopd
  4354.         move.w    (a7)+,drive
  4355.  
  4356.         bsr    remove_pic
  4357.  
  4358.         move.l    #ev_line,d1        ;ptr on filename
  4359.         moveq    #-1,d2            ;mode create
  4360.         bsr    open_file
  4361.         move.l    d0,d7
  4362.         beq.w    .err
  4363.  
  4364.         move.w    #-1,ts_size        ;trainer buffer cleared
  4365.  
  4366.         lea.l    tmp_mem,a4
  4367.         move.l    #"ARSC",(a4)
  4368.  
  4369.         move.l    d7,d1
  4370.         move.l    a4,d2
  4371.         moveq    #4,d3
  4372.         bsr    write_file        ;save header 'ARSC'
  4373.         bne.w    .err
  4374.  
  4375.         move.l    d7,d1
  4376.         move.l    #registres,d2
  4377.         move.l    #end_registres-registres,d3
  4378.         bsr    write_file        ;save registers
  4379.         bne.w    .err
  4380.  
  4381.         move.l    d7,d1
  4382.         move.l    #custom,d2
  4383.         move.l    #$200,d3
  4384.         bsr    write_file        ;save custom registers
  4385.         bne.w    .err
  4386.  
  4387.         move.l    d7,d1
  4388.         move.l    #palette,d2
  4389.         move.l    #256*4,d3
  4390.         bsr    write_file        ;save palette
  4391.         bne.w    .err
  4392.  
  4393.         move.l    d7,d1
  4394.         move.l    #CIAA,d2
  4395.         moveq    #32,d3
  4396.         bsr    write_file        ;save CIA registers
  4397.         bne.w    .err
  4398.  
  4399.         move.l    d7,d1
  4400.         move.l    #old_head,d2
  4401.         moveq    #4*2,d3
  4402.         bsr    write_file        ;write head pos of drives
  4403.         bne.w    .err
  4404.  
  4405.         move.l    d7,a0
  4406.         move.l    file_part(a0),a0
  4407.         cmp.l    #floppy_device,part_device(a0)
  4408.         bne.w    .goHD
  4409.  
  4410. ;-------------- floppy save routine ----------------
  4411.  
  4412.         move.l    d7,d1
  4413.         moveq    #0,d2
  4414.         move.l    #$4008,d3
  4415.         bsr    write_file        ;write low-mem
  4416.         bne.w    .err
  4417.  
  4418.         lea.l    $4008.w,a0
  4419.         sub.l    a1,a1
  4420.         move.l    #$200000-$4008,d0
  4421.         bsr    pack
  4422.         move.l    d0,d6            ;d6=packed size
  4423.  
  4424.         move.l    d6,d3
  4425.         move.l    #1730*512-$4008-$68e,d0    ;size left on disk
  4426.         cmp.l    d0,d3
  4427.         blt.b    .okd3
  4428.         move.l    d0,d3
  4429. .okd3        sub.l    d3,d6
  4430.         move.l    d7,d1
  4431.         moveq    #0,d2
  4432.         bsr    write_file        ;write data on 1st disk
  4433.         bne.w    .err
  4434.  
  4435.         move.l    d7,d1
  4436.         bsr    close_file
  4437.  
  4438.         tst.l    d6
  4439.         beq.w    .lowmem
  4440.  
  4441. ;----------
  4442.  
  4443.         bsr    flush_fbuffer
  4444.         bsr    force_change
  4445.  
  4446.         bsr    set_pic
  4447.         lea.l    disk2_txt(pc),a0
  4448.         bsr    print
  4449.         bsr    get_key
  4450.         lea.l    diskclr_txt(pc),a0
  4451.         bsr    print
  4452.         bsr    remove_pic
  4453.         tst.b    break
  4454.         bne.w    .err
  4455.  
  4456.         move.l    #ev_line,d1        ;ptr on filename
  4457.         moveq    #-1,d2            ;mode create
  4458.         bsr    open_file
  4459.         move.l    d0,d7
  4460.         beq.w    .err
  4461.  
  4462.         lea.l    tmp_mem,a4
  4463.         move.l    #"ARC2",(a4)
  4464.         move.l    d7,d1
  4465.         move.l    a4,d2
  4466.         moveq    #4,d3
  4467.         bsr    write_file
  4468.         bne.w    .err
  4469.  
  4470.         move.l    d6,d3
  4471.         move.l    #1730*512-4,d0
  4472.         cmp.l    d0,d3
  4473.         blt.b    .okd3b
  4474.         move.l    d0,d3
  4475. .okd3b        sub.l    d3,d6
  4476.         move.l    d7,d1
  4477.         move.l    #1730*512-$4008-$68e,d2    ;size saved on 1st disk
  4478.         bsr    write_file
  4479.         bne.w    .err
  4480.  
  4481.         move.l    d7,d1
  4482.         bsr    close_file
  4483.         tst.l    d6
  4484.         beq.w    .enddisk
  4485.  
  4486. ;----------
  4487.  
  4488.         bsr    flush_fbuffer
  4489.         bsr    force_change
  4490.  
  4491.         bsr    set_pic
  4492.         lea.l    disk3_txt(pc),a0
  4493.         bsr    print
  4494.         bsr    get_key
  4495.         lea.l    diskclr_txt(pc),a0
  4496.         bsr    print
  4497.         bsr    remove_pic
  4498.         tst.b    break
  4499.         bne.w    .err
  4500.  
  4501.         move.l    #ev_line,d1        ;ptr on filename
  4502.         moveq    #-1,d2            ;mode create
  4503.         bsr    open_file
  4504.         move.l    d0,d7
  4505.         beq.w    .err
  4506.  
  4507.         lea.l    tmp_mem,a4
  4508.         move.l    #"ARC3",(a4)
  4509.         move.l    d7,d1
  4510.         move.l    a4,d2
  4511.         moveq    #4,d3
  4512.         bsr    write_file
  4513.         bne.w    .err
  4514.  
  4515.         move.l    d6,d3
  4516.         move.l    d7,d1
  4517.         move.l    #(1730*512-$4008-$68e)+(1730*512-4),d2
  4518.                         ;size saved on disks 1&2
  4519.         bsr    write_file
  4520.         bne.w    .err
  4521.  
  4522. .retry        move.l    d7,d1
  4523.         bsr    close_file
  4524.  
  4525. .enddisk    bsr    flush_fbuffer
  4526.         bsr    force_change
  4527.         clr.w    drive_err
  4528.  
  4529.         bsr    set_pic
  4530.         lea.l    disk1_txt(pc),a0
  4531.         bsr    print
  4532.         bsr    get_key
  4533.         lea.l    diskclr_txt(pc),a0
  4534.         bsr    print
  4535.         bsr    remove_pic
  4536.         tst.b    break
  4537.         bne.w    .err
  4538.  
  4539. .lowmem        move.l    #ev_line,d1
  4540.         moveq    #0,d2
  4541.         bsr    open_file
  4542.         move.l    d0,d7
  4543.         beq.b    .enddisk
  4544.  
  4545.         lea.l    tmp_mem,a4
  4546.         move.l    a4,d2
  4547.         moveq    #4,d3
  4548.         move.l    d7,d1
  4549.         bsr    read_file
  4550.         bne.b    .retry
  4551.         cmp.l    #"ARSC",(a4)
  4552.         bne.b    .retry
  4553.  
  4554.         move.l    d7,d1
  4555.         move.l    #$68e,d2
  4556.         moveq    #-1,d3
  4557.         bsr    seek_file
  4558.  
  4559.         sub.l    a0,a0
  4560.         lea.l    $4008.w,a1
  4561.         bsr    depack
  4562.  
  4563.         move.l    d7,d1
  4564.         moveq    #0,d2
  4565.         move.l    #$4008,d3
  4566.         bsr    read_file
  4567.  
  4568.         bra.b    .endsave
  4569.  
  4570. ;-----------------------------------------------
  4571.  
  4572. .goHD        move.l    d7,d1
  4573.         moveq    #0,d2
  4574.         move.l    #$4008,d3
  4575.         bsr    write_file        ;save low-mem
  4576.         bne.b    .err
  4577.  
  4578.         lea.l    $4008.w,a0
  4579.         lea.l    $0.w,a1
  4580.         move.l    #$200000-$4008,d0
  4581.         bsr    pack
  4582.         move.l    d0,d3
  4583.         move.l    d0,d5            ;d5=packed size+header
  4584.         move.l    d7,d1
  4585.         moveq    #0,d2
  4586.         bsr    write_file        ;save packed mem
  4587.         bne.b    .err
  4588.  
  4589.         lea.l    $0.w,a0
  4590.         lea.l    $4008.w,a1
  4591.         bsr    depack
  4592.  
  4593.         move.l    d7,d1
  4594.         move.l    d5,d2
  4595.         add.l    #$4008,d2
  4596.         neg.l    d2
  4597.         moveq    #0,d3
  4598.         bsr    seek_file
  4599.  
  4600.         move.l    d7,d1
  4601.         moveq    #0,d2
  4602.         move.l    #$4008,d3
  4603.         bsr    read_file
  4604.  
  4605. .endsave    move.l    d7,d1
  4606.         bsr    close_file
  4607.  
  4608. .err        bsr    set_pic
  4609.  
  4610.         bra.w    end_command
  4611.  
  4612.  
  4613. ;-------------- LA ----------------------------------------
  4614. ;-------------- load a saved game -------------------------
  4615.  
  4616. cmd_la        lea.l    ev_line,a1
  4617.         bsr.w    read_name
  4618.         tst.b    (a1)
  4619.         beq.w    illegal_name
  4620.  
  4621.         bsr    remove_pic
  4622.  
  4623.         move.l    #ev_line,d1        ;ptr on filename
  4624.         moveq    #0,d2            ;mode oldfile
  4625.         bsr    open_file
  4626.         move.l    d0,d7
  4627.         beq.w    .err
  4628.  
  4629.         lea.l    tmp_mem,a4
  4630.  
  4631.         move.w    #-1,ts_size        ;trainer buffer cleared
  4632.  
  4633.         move.l    d7,d1
  4634.         move.l    a4,d2
  4635.         moveq    #4,d3
  4636.         bsr    read_file        ;read header 'ARSV'
  4637.         bne.w    .err
  4638.  
  4639.         sf    packed
  4640.         cmp.l    #'ARSV',(a4)
  4641.         beq.b    .okarsv
  4642.         st    packed
  4643.         cmp.l    #'ARSC',(a4)
  4644.         beq.b    .okarsv
  4645.         lea.l    noarsv_txt(pc),a0
  4646.         bsr    print
  4647.         bra.w    .close
  4648. .okarsv
  4649.         move.l    d7,d1
  4650.         move.l    #registres,d2
  4651.         move.l    #end_registres-registres,d3
  4652.         bsr    read_file        ;read registers
  4653.         bne.w    .err
  4654.  
  4655.         move.l    d7,d1
  4656.         move.l    #custom,d2
  4657.         move.l    #$200,d3
  4658.         bsr    read_file        ;read custom registers
  4659.         bne.w    .err
  4660.  
  4661.         lea.l    custom,a1
  4662.         lea.l    $dff000,a2
  4663.         lea.l    move_list2(pc),a0
  4664.         move.w    #$100-1,d0
  4665. .loop        tst.b    (a0)+
  4666.         beq.b    .nomove
  4667.         move.w    (a1),(a2)        ;reinit custom registers
  4668. .nomove        addq.l    #2,a1
  4669.         addq.l    #2,a2
  4670.         dbf    d0,.loop
  4671.         clr.w    $dff088
  4672.         move.w    #0,$dff106
  4673.         move.w    #0,$dff180
  4674.  
  4675.         move.l    d7,d1
  4676.         move.l    #palette,d2
  4677.         move.l    #256*4,d3
  4678.         bsr    read_file        ;read palette
  4679.         bne.w    .err
  4680.  
  4681.         move.l    d7,d1
  4682.         move.l    #CIAA,d2
  4683.         moveq    #32,d3
  4684.         bsr    read_file        ;read CIA registers
  4685.         bne.w    .err
  4686.  
  4687.         move.l    d7,d1
  4688.         move.l    a4,d2
  4689.         moveq    #8,d3
  4690.         bsr    read_file        ;read drive headpos
  4691.  
  4692.         lea.l    old_head,a1
  4693.         move.l    a4,a2
  4694.         move.w    drive,-(a7)
  4695.         moveq    #3,d4            ;first drive SEL (drive0)
  4696.         lea.l    drive_present,a3
  4697.         moveq    #4-1,d5            ;4 drives
  4698. .loopd        tst.b    (a3)+
  4699.         beq.b    .nodrive
  4700.         move.w    d4,drive        ;init
  4701.         bsr    inittete        ;floppy drive head pos
  4702.         move.w    (a2),(a1)        ;init old_head
  4703. .nodrive    addq.w    #1,d4
  4704.         addq.l    #2,a1
  4705.         addq.l    #2,a2
  4706.         dbf    d5,.loopd
  4707.         move.w    (a7)+,drive
  4708.  
  4709.         move.l    d7,a0
  4710.         move.l    file_part(a0),a0
  4711.         cmp.l    #floppy_device,part_device(a0)
  4712.         bne.w    .goHD
  4713.  
  4714. ;-------------- floppy load --------------------
  4715.  
  4716.         tst.b    packed
  4717.         beq.w    .nopackedf
  4718.  
  4719. ;-------------- packed floppy load ---------
  4720.  
  4721.         move.l    d7,d1
  4722.         move.l    #$4008,d2
  4723.         moveq    #0,d3
  4724.         bsr    seek_file        ;skip low-mem
  4725.  
  4726.         move.l    d7,d1
  4727.         moveq    #0,d2
  4728.         move.l    #1730*512-$68e-$4008,d3
  4729.         bsr    read_file        ;read 1st disk
  4730.  
  4731.         move.l    $0.w,d6
  4732.         bpl.b    .okposf
  4733.         neg.l    d6
  4734. .okposf        addq.l    #8,d6        ;d6=packed size
  4735.         move.l    d1,a0
  4736.         move.l    file_size(a0),d0
  4737.         sub.l    #$68e+$4008,d0
  4738.         move.l    d0,d5
  4739.         sub.l    d0,d6
  4740.         beq.w    .lowmem
  4741.  
  4742. .retry2c    move.l    d7,d1
  4743.         bsr    close_file
  4744.  
  4745. .retry2bc    bsr    set_pic
  4746.         lea.l    disk2_txt(pc),a0
  4747.         bsr    print
  4748.         bsr    get_key
  4749.         lea.l    diskclr_txt(pc),a0
  4750.         bsr    print
  4751.         bsr    remove_pic
  4752.         tst.b    break
  4753.         bne.w    .err
  4754.  
  4755.         clr.w    drive_err
  4756.         move.l    #ev_line,d1        ;ptr on filename
  4757.         moveq    #0,d2            ;mode oldfile
  4758.         bsr    open_file
  4759.         move.l    d0,d7
  4760.         beq.b    .retry2bc
  4761.  
  4762.         lea.l    tmp_mem,a4
  4763.         move.l    d7,d1
  4764.         move.l    a4,d2
  4765.         moveq    #4,d3
  4766.         bsr    read_file
  4767.         bne.b    .retry2c
  4768.         cmp.l    #"ARC2",(a4)
  4769.         bne.b    .retry2c
  4770.  
  4771.         move.l    d7,d1
  4772.         move.l    d5,d2
  4773.         move.l    #1730*512-4,d3
  4774.         bsr    read_file        ;read disk2
  4775.  
  4776.         move.l    d1,a0
  4777.         move.l    file_size(a0),d0
  4778.         subq.l    #4,d0
  4779.         sub.l    d0,d6
  4780.         beq.b    .enddisk
  4781.         add.l    d0,d5
  4782.  
  4783. .retry3c    move.l    d7,d1
  4784.         bsr    close_file
  4785.  
  4786. .retry3bc    bsr    set_pic
  4787.         lea.l    disk3_txt(pc),a0
  4788.         bsr    print
  4789.         bsr    get_key
  4790.         lea.l    diskclr_txt(pc),a0
  4791.         bsr    print
  4792.         bsr    remove_pic
  4793.         tst.b    break
  4794.         bne.w    .err
  4795.  
  4796.         clr.w    drive_err
  4797.         move.l    #ev_line,d1        ;ptr on filename
  4798.         moveq    #0,d2            ;mode oldfile
  4799.         bsr    open_file
  4800.         move.l    d0,d7
  4801.         beq.b    .retry3bc
  4802.  
  4803.         lea.l    tmp_mem,a4
  4804.         move.l    d7,d1
  4805.         move.l    a4,d2
  4806.         moveq    #4,d3
  4807.         bsr    read_file
  4808.         bne.b    .retry3c
  4809.         cmp.l    #"ARC3",(a4)
  4810.         bne.b    .retry3c
  4811.  
  4812.         move.l    d7,d1
  4813.         move.l    d5,d2
  4814.         move.l    #1730*512-4,d3
  4815.         bsr    read_file        ;read disk3
  4816.  
  4817. .enddisk
  4818.         move.l    d7,d1
  4819.         bsr    close_file
  4820.  
  4821.     ;ask disk1 and read low-mem
  4822.  
  4823. .retry1        bsr    set_pic
  4824.         lea.l    disk1_txt(pc),a0
  4825.         bsr    print
  4826.         bsr    get_key
  4827.         lea.l    diskclr_txt(pc),a0
  4828.         bsr    print
  4829.         bsr    remove_pic
  4830.         tst.b    break
  4831.         bne.w    .err
  4832.  
  4833.         clr.w    drive_err
  4834.         move.l    #ev_line,d1        ;ptr on filename
  4835.         moveq    #0,d2            ;mode oldfile
  4836.         bsr    open_file
  4837.         move.l    d0,d7
  4838.         beq.b    .retry1
  4839.  
  4840.         lea.l    tmp_mem,a4
  4841.         move.l    d7,d1
  4842.         move.l    a4,d2
  4843.         moveq    #4,d3
  4844.         bsr    read_file
  4845.         bne.b    .enddisk
  4846.         cmp.l    #"ARSC",(a4)
  4847.         bne.b    .enddisk
  4848.  
  4849. .lowmem        move.l    d7,d1
  4850.         move.l    #$68e,d2
  4851.         moveq    #-1,d3
  4852.         bsr    seek_file
  4853.  
  4854.         sub.l    a0,a0
  4855.         lea.l    $4008.w,a1
  4856.         bsr    depack
  4857.  
  4858.         move.l    d7,d1
  4859.         moveq    #0,d2
  4860.         move.l    #$4008,d3
  4861.         bsr    read_file        ;read low-mem
  4862.  
  4863.         bra.w    .close
  4864.  
  4865. ;-------------- non-packed floppy load -----
  4866.  
  4867. .nopackedf    move.l    d7,d1
  4868.         moveq    #0,d2
  4869.         move.l    #$CD000,d3
  4870.         bsr    read_file
  4871.         bne.w    .err
  4872.  
  4873. .retry2        move.l    d7,d1
  4874.         bsr    close_file
  4875.  
  4876. .retry2b    bsr    set_pic
  4877.         lea.l    disk2_txt(pc),a0
  4878.         bsr    print
  4879.         bsr    get_key
  4880.         lea.l    diskclr_txt(pc),a0
  4881.         bsr    print
  4882.         bsr    remove_pic
  4883.         tst.b    break
  4884.         bne.w    .err
  4885.  
  4886.         clr.w    drive_err
  4887.         move.l    #ev_line,d1        ;ptr on filename
  4888.         moveq    #0,d2            ;mode oldfile
  4889.         bsr    open_file
  4890.         move.l    d0,d7
  4891.         beq.b    .retry2b
  4892.  
  4893.         lea.l    tmp_mem,a4
  4894.         move.l    d7,d1
  4895.         move.l    a4,d2
  4896.         moveq    #4,d3
  4897.         bsr    read_file
  4898.         bne.b    .retry2
  4899.         cmp.l    #"ARS2",(a4)
  4900.         bne.b    .retry2
  4901.  
  4902.         move.l    d7,d1
  4903.         move.l    #$CD000,d2
  4904.         move.l    d2,d3
  4905.         bsr    read_file        ;read data from disk2
  4906.         bne.w    .err
  4907.  
  4908. .retry3        move.l    d7,d1
  4909.         bsr    close_file
  4910.  
  4911. .retry3b    bsr    set_pic
  4912.         lea.l    disk3_txt(pc),a0
  4913.         bsr    print
  4914.         bsr    get_key
  4915.         lea.l    diskclr_txt(pc),a0
  4916.         bsr    print
  4917.         bsr    remove_pic
  4918.         tst.b    break
  4919.         bne.w    .err
  4920.  
  4921.         clr.w    drive_err
  4922.         move.l    #ev_line,d1        ;ptr on filename
  4923.         moveq    #0,d2            ;mode oldfile
  4924.         bsr    open_file
  4925.         move.l    d0,d7
  4926.         beq.b    .retry3b
  4927.  
  4928.         lea.l    tmp_mem,a4
  4929.         move.l    d7,d1
  4930.         move.l    a4,d2
  4931.         moveq    #4,d3
  4932.         bsr    read_file
  4933.         bne.b    .retry3
  4934.         cmp.l    #"ARS3",(a4)
  4935.         bne.b    .retry3
  4936.  
  4937.         move.l    d7,d1
  4938.         move.l    #2*$CD000,d2
  4939.         move.l    #$200000-2*$CD000,d3
  4940.         bsr    read_file        ;read data from disk3
  4941.         bne.w    .err
  4942.         bra.w    .close
  4943.  
  4944. ;------------------------------------------------
  4945.  
  4946. .goHD        tst.b    packed
  4947.         beq.b    .nopacked
  4948.         move.l    d7,d1
  4949.         move.l    #$4008,d2
  4950.         moveq    #0,d3
  4951.         bsr    seek_file        ;skip low-mem
  4952.         move.l    d7,d1
  4953.         moveq    #0,d2
  4954.         moveq    #8,d3
  4955.         bsr    read_file        ;read pack header
  4956.         bne.b    .err
  4957.         move.l    $0.w,d3            ;get packed size
  4958.         bpl.b    .okpos
  4959.         neg.l    d3
  4960. .okpos        move.l    d7,d1
  4961.         moveq    #8,d2
  4962.         move.l    d3,d5
  4963.         bsr    read_file        ;read packed data
  4964.         lea.l    $0.w,a0
  4965.         lea.l    $4008.w,a1
  4966.         bsr    depack
  4967.  
  4968.         move.l    d7,d1
  4969.         move.l    d5,d2
  4970.         add.l    #$4008+8,d2
  4971.         neg.l    d2
  4972.         moveq    #0,d3
  4973.         bsr    seek_file
  4974.  
  4975.         move.l    d7,d1
  4976.         moveq    #0,d2
  4977.         move.l    #$4008,d3
  4978.         bsr    read_file        ;read low-mem area
  4979.  
  4980.         bra.b    .close
  4981.  
  4982. .nopacked    move.l    d7,d1
  4983.         moveq    #0,d2
  4984.         move.l    #$200000,d3
  4985.         bsr    read_file        ;read all CHIPMEM
  4986.         bne.b    .err
  4987.  
  4988. .close        move.l    d7,d1
  4989.         bsr    close_file
  4990.  
  4991. .err        bsr    set_pic
  4992.  
  4993.         bra.w    end_command
  4994.  
  4995. noarsv_txt    dc.b "Not a HRTmon save file !",$a,0
  4996.         even
  4997.  
  4998. ;-------------- list of registers to be initialised after la_cmd ----
  4999.  
  5000. move_list2    dcb.b $10,0        ;$00-$1e
  5001.         dc.b -1,-1,-1        ;$20-$24
  5002.         dc.b 0,0,0,0        ;$26-$2c
  5003.         dcb.b 5,-1        ;$2e-$36
  5004.         dcb.b 4,0        ;$38-$3e
  5005.         dcb.b $c,-1        ;$40-$56
  5006.         dc.b 0,0        ;$58,$5a
  5007.         dc.b 0,0        ;$5c,$5e
  5008.         dcb.b 4,-1        ;$60-$66
  5009.         dcb.b 4,0        ;$68-$6e
  5010.         dc.b -1,-1,-1        ;$70-$74
  5011.         dcb.b 4,0        ;$76-$7c
  5012.         dc.b -1            ;$7e
  5013.         dc.b -1,-1        ;$80,$82    ;cop1
  5014.         dc.b -1,-1        ;$84,$86    ;cop2
  5015.         dc.b 0,0,0        ;$88,$8a,$8c
  5016.         dc.b -1,-1,-1,-1    ;$8e,$90,$92,$94
  5017.         dc.b 0,-1,0,0        ;$96-$9c
  5018.         dcb.b $21,-1        ;$9e-$de
  5019.         dcb.b $10,-1        ;$e0-$fe
  5020.         dc.b 0,0,-1,0        ;$100-$106
  5021.         dc.b -1,-1,0        ;$108-$10c
  5022.         dc.b -1            ;$10e
  5023.         dcb.b 8,0        ;$110-$11e
  5024.         dcb.b $10,-1        ;$120-$13e
  5025.         dcb.b $20,0        ;$140-$17e
  5026.         dcb.b $20,0        ;$180-$1be
  5027.         dcb.b $d,-1        ;$1c0-$1d8
  5028.         dc.b 0            ;$1da
  5029.         dc.b 0            ;$1dc
  5030.         dc.b -1,-1,-1        ;$1de-$1e2
  5031.         dc.b 0            ;$1e4
  5032.         dcb.b 5,-1        ;$1e6-$1ee
  5033.         dcb.b 6,0        ;$1f0-$1fa
  5034.         dc.b 0            ;$1fc
  5035.         dc.b 0            ;$1fe
  5036.  
  5037. ;-------------- MOTOR -------------------------------------
  5038.  
  5039. cmd_motor    bsr    motor_on
  5040.         bra.w    end_command
  5041.  
  5042. ;----------------------------------------------------------
  5043.  
  5044. cmd_intel    lea.l    outside_txt(pc),a0
  5045.         bsr    print
  5046.  
  5047.         lea.l    cheat_cnt,a0
  5048.         tst.b    (a0)
  5049.         beq.b    .zero
  5050.         sf    (a0)
  5051.         bra.b    .out
  5052. .zero        addq.b    #1,(a0)
  5053. .out        bra.w    end_command
  5054.  
  5055. outside_txt    dc.b "OUTSIDE !",$a,0
  5056.         even
  5057.  
  5058. cmd_hornet    lea.l    hornet_txt(pc),a0
  5059.         bsr    print
  5060.  
  5061.         lea.l    cheat_cnt,a0
  5062.         cmp.b    #1,(a0)
  5063.         beq.b    .zero
  5064.         sf    (a0)
  5065.         bra.b    .out
  5066. .zero        addq.b    #1,(a0)
  5067. .out        bra.w    end_command
  5068.  
  5069.  
  5070. hornet_txt    dc.b "Illegal but nice command.",$a,0
  5071.         even
  5072.  
  5073. ;-------------- TSD deep trainer start --------------------
  5074.  
  5075. cmd_tsd        st    ts_deep
  5076.         bra.b    cmd_ts_go
  5077.  
  5078. ;-------------- TS trainer start --------------------------
  5079.  
  5080. cmd_ts        sf    ts_deep
  5081.  
  5082. cmd_ts_go    bsr    evaluate        ;get start address
  5083.         bne.w    illegal_addr
  5084.         move.l    d0,ts_start
  5085.         bsr    evaluate        ;get end address
  5086.         bne.w    illegal_addr
  5087.         move.l    d0,ts_end
  5088.         sub.l    ts_start,d0
  5089.         ble.w    illegal_addr
  5090.  
  5091.         movem.l    ts_start,d0-d1
  5092.         btst    #0,d0            ;even address ?
  5093.         bne.w    illegal_addr
  5094.         btst    #0,d1            ;even address ?
  5095.         bne.w    illegal_addr
  5096.  
  5097.         clr.w    eval_size        ;.b par default
  5098.         bsr    evaluate        ;get nb of lives in d0
  5099.         bne.w    illegal_val
  5100.          move.w    eval_size,ts_size    ;.b .w .l (0,1,2)
  5101.  
  5102.         lea.l    tmp_mem,a0
  5103.         bsr    live_scan
  5104.  
  5105.         bra.w    end_command
  5106.  
  5107. ;--------------------------------------
  5108. ;-> d0=nb of lives
  5109. ;-> a0=start of trainer buffer in 'tmp_mem'
  5110.  
  5111. live_scan    move.l    ts_end,d1
  5112.         cmp.l    ts_start,d1
  5113.         beq.w    .noscan
  5114.  
  5115.         move.l    d0,d3
  5116.         tst.b    ts_deep
  5117.         beq.b    .nodeep
  5118.         addq.l    #1,d0            ;d0=max val
  5119.         subq.l    #1,d3            ;d3=min val
  5120. .nodeep
  5121.  
  5122.         move.w    ts_size,d1        ;.b .w .l (0,1,2)
  5123.         beq.w    .go_b
  5124.         cmp.w    #1,d1
  5125.         bne.w    .go_l
  5126.         lea.l    tmp_mem+tmp_mem_size,a3
  5127.         subq.l    #4,a3            ;for end signal
  5128.         move.l    ts_start,a1
  5129.         move.l    ts_end,a2
  5130. .seek1        move.l    a1,a4
  5131.         move.l    a1,watch
  5132.         RELOC_PIC 1
  5133.         cmp.w    (a4),d3
  5134.         bgt.b    .no_eg1
  5135.         cmp.w    (a4),d0
  5136.         blt.b    .no_eg1
  5137.         move.l    a1,(a0)+
  5138.         cmp.l    a3,a0
  5139.         bge.w    .end_seek
  5140. .no_eg1        addq.l    #2,a1
  5141.         tst.b    break
  5142.         bne.w    .end_seek
  5143.         cmp.l    a2,a1
  5144.         blt.w    .seek1
  5145.         bra.w    .end_seek
  5146.  
  5147. .go_l        lea.l    tmp_mem+tmp_mem_size,a3
  5148.         subq.l    #4,a3            ;for end signal
  5149.         move.l    ts_start,a1
  5150.         move.l    ts_end,a2
  5151. .seek2        move.l    a1,a4
  5152.         move.l    a1,watch
  5153.         RELOC_PIC 2
  5154.         cmp.l    (a4),d3
  5155.         bgt.b    .no_eg2
  5156.         cmp.l    (a4),d0
  5157.         blt.b    .no_eg2
  5158.         move.l    a1,(a0)+
  5159.         cmp.l    a3,a0
  5160.         bge.w    .end_seek
  5161. .no_eg2        addq.l    #2,a1
  5162.         tst.b    break
  5163.         bne.w    .end_seek
  5164.         cmp.l    a2,a1
  5165.         blt.w    .seek2
  5166.         bra.w    .end_seek
  5167.  
  5168. .go_b        lea.l    tmp_mem+tmp_mem_size,a3
  5169.         subq.l    #4,a3            ;for end signal
  5170.         move.l    ts_start,a1
  5171.         move.l    ts_end,a2
  5172. .seek3        move.l    a1,a4
  5173.         move.l    a1,watch
  5174.         RELOC_PIC 3
  5175.         cmp.b    (a4),d3
  5176.         bgt.b    .no_eg3
  5177.         cmp.b    (a4),d0
  5178.         blt.b    .no_eg3
  5179.         move.l    a1,(a0)+
  5180.         cmp.l    a3,a0
  5181.         bge.b    .end_seek
  5182. .no_eg3        addq.l    #1,a1
  5183.         tst.b    break
  5184.         bne.b    .end_seek
  5185.         cmp.l    a2,a1
  5186.         blt.w    .seek3
  5187.  
  5188. .end_seek    move.l    #-1,(a0)        ;end signal
  5189.  
  5190.         moveq    #8,d1
  5191.  
  5192.         lea.l    ts_txt,a0
  5193.         bsr    print
  5194.         move.l    ts_start,d0
  5195.         bsr    print_hex
  5196.         lea.l    ts1_txt,a0
  5197.         bsr    print
  5198.         move.l    a1,d0
  5199.         move.l    a1,ts_start
  5200.         bsr    print_hexCR
  5201.  
  5202. .noscan        rts
  5203.  
  5204. ts_txt        dc.b "Scan range : $",0
  5205. ts1_txt        dc.b " - $",0
  5206.         even
  5207.  
  5208. ;-------------- TF trainer find ---------------------------
  5209.  
  5210. cmd_tf
  5211.         bsr    evaluate        ;read new nb of lives
  5212.         bne.w    illegal_val
  5213.         move.l    d0,d7            ;new nb of lives=d7
  5214.  
  5215.         move.l    d7,d3
  5216.         move.l    d7,d4
  5217.         tst.b    ts_deep
  5218.         beq.b    .nodeep
  5219.         addq.l    #1,d3            ;d3=max val
  5220.         subq.l    #1,d4            ;d4=min val
  5221.  
  5222. .nodeep        lea.l    tmp_mem,a1
  5223.         move.l    a1,a2
  5224.         moveq    #-1,d2
  5225.  
  5226.         move.w    ts_size,d1
  5227.         bpl.b    .oksize
  5228.         lea.l    firstts_txt(pc),a0
  5229.         bsr    print
  5230.         bra.w    end_command
  5231. .oksize        beq.w    .go_b
  5232.  
  5233.         cmp.w    #1,d1
  5234.         bne.w    .go_l
  5235.  
  5236.         moveq    #8,d1
  5237. .seek1        tst.b    break
  5238.         bne.w    .end_seek
  5239.         cmp.l    (a1),d2
  5240.         beq.w    .end_seek
  5241.         move.l    (a1)+,a4
  5242.         RELOC_PIC 1
  5243.         cmp.w    (a4),d4
  5244.         bgt.w    .seek1
  5245.         cmp.w    (a4),d3
  5246.         blt.w    .seek1
  5247.         move.l    -4(a1),d0
  5248.         move.l    d0,(a2)+
  5249.         lea.l    tf_txt+1,a0
  5250.         bsr    conv_hex
  5251.         lea.l    tf_txt,a0
  5252.         bsr    print
  5253.         bra.w    .seek1
  5254.  
  5255. .go_l        moveq    #8,d1
  5256. .seek2        tst.b    break
  5257.         bne.w    .end_seek
  5258.         cmp.l    (a1),d2
  5259.         beq.w    .end_seek
  5260.         move.l    (a1)+,a4
  5261.         RELOC_PIC 2
  5262.         cmp.l    (a4),d4
  5263.         bgt.w    .seek2
  5264.         cmp.l    (a4),d3
  5265.         blt    .seek2
  5266.         move.l    -4(a1),d0
  5267.         move.l    d0,(a2)+
  5268.         lea.l    tf_txt+1,a0
  5269.         bsr    conv_hex
  5270.         lea.l    tf_txt,a0
  5271.         bsr    print
  5272.         bra.w    .seek2
  5273.  
  5274. .go_b        moveq    #8,d1
  5275. .seek3        tst.b    break
  5276.         bne.w    .end_seek
  5277.         cmp.l    (a1),d2
  5278.         beq.w    .end_seek
  5279.         move.l    (a1)+,a4
  5280.         RELOC_PIC 3
  5281.         cmp.b    (a4),d4
  5282.         bgt.w    .seek3
  5283.         cmp.b    (a4),d3
  5284.         blt.w    .seek3
  5285.         move.l    -4(a1),d0
  5286.         move.l    d0,(a2)+
  5287.         lea.l    tf_txt+1,a0
  5288.         bsr    conv_hex
  5289.         lea.l    tf_txt,a0
  5290.         bsr    print
  5291.         bra.w    .seek3
  5292.  
  5293. .end_seek    move.l    d2,(a2)        ;set new end signal
  5294.  
  5295.         cmp.l    #tmp_mem+tmp_mem_size-4,a2
  5296.         bge.b    .noscan
  5297.  
  5298.         move.l    a2,a0        ;tmp_mem buffer
  5299.         move.l    d7,d0        ;nb of lives
  5300.         bsr    live_scan
  5301.  
  5302. .noscan        tst.w    cursor_x
  5303.         beq.b    .no_CR
  5304.         lea.l    cr_txt,a0
  5305.         bsr    print
  5306. .no_CR        bra.w    end_command
  5307.  
  5308. firstts_txt    dc.b "First use TS command !",$a,0
  5309.         even
  5310.  
  5311. ;-------------- debug -------------------------------------
  5312.  
  5313. cmd_debug    bsr    remove_pic
  5314.  
  5315.         not.b    debug
  5316.         beq.w    .clear
  5317.         move.l    vbr_reg,a0
  5318.         move.l    $8(a0),exc8        ;BUS
  5319.         move.l    $c(a0),excC        ;Address
  5320.         move.l    $10(a0),exc10        ;Illegal
  5321.         move.l    $14(a0),exc14        ;Zero
  5322.         move.l    $28(a0),exc28        ;LineA
  5323.         move.l    $2C(a0),exc2C        ;LineF
  5324.  
  5325.         lea.l    debug_bus(pc),a1
  5326.         move.l    a1,$8(a0)
  5327.         lea.l    debug_addr(pc),a1
  5328.         move.l    a1,$C(a0)
  5329.         lea.l    debug_illegal(pc),a1
  5330.         move.l    a1,$10(a0)
  5331.         lea.l    debug_zero(pc),a1
  5332.         move.l    a1,$14(a0)
  5333.         lea.l    debug_linea(pc),a1
  5334.         move.l    a1,$28(a0)
  5335.         lea.l    debug_linef(pc),a1
  5336.         move.l    a1,$2c(a0)
  5337.  
  5338.         lea.l    debug1_txt,a0
  5339.         bsr    print
  5340.         bra.w    .okset
  5341.  
  5342. .clear        move.l    vbr_reg,a0
  5343.         lea.l    debug_bus(pc),a1
  5344.         cmp.l    $8(a0),a1
  5345.         bne.b    .no8
  5346.         move.l    exc8,$8(a0)
  5347. .no8        lea.l    debug_addr(pc),a1
  5348.         cmp.l    $C(a0),a1
  5349.         bne.b    .noC
  5350.         move.l    excC,$C(a0)
  5351. .noC        lea.l    debug_illegal(pc),a1
  5352.         cmp.l    $10(a0),a1
  5353.         bne.b    .no10
  5354.         move.l    exc10,$10(a0)
  5355. .no10        lea.l    debug_zero(pc),a1
  5356.         cmp.l    $14(a0),a1
  5357.         bne.b    .no14
  5358.         move.l    exc14,$14(a0)
  5359. .no14        lea.l    debug_linea(pc),a1
  5360.         cmp.l    $28(a0),a1
  5361.         bne.b    .no28
  5362.         move.l    exc28,$28(a0)
  5363. .no28        lea.l    debug_linef(pc),a1
  5364.         cmp.l    $2C(a0),a1
  5365.         bne.b    .no2C
  5366.         move.l    exc2C,$2C(a0)
  5367. .no2C
  5368.         lea.l    debug2_txt,a0
  5369.         bsr    print
  5370.  
  5371. .okset        bsr    set_pic
  5372.         bra.w    end_command
  5373.  
  5374. debug1_txt    dc.b "Debug mode on.",$a,0
  5375. debug2_txt    dc.b "Debug mode off.",$a,0
  5376.         even
  5377.  
  5378. debug_bus    move.b    #1,debug_entry
  5379.         jmp    monitor
  5380. debug_addr    move.b    #2,debug_entry
  5381.         jmp    monitor
  5382. debug_illegal    move.b    #3,debug_entry
  5383.         jmp    monitor
  5384. debug_zero    move.b    #4,debug_entry
  5385.         jmp    monitor
  5386. debug_linea    move.b    #5,debug_entry
  5387.         jmp    monitor
  5388. debug_linef    move.b    #6,debug_entry
  5389.         jmp    monitor
  5390.  
  5391. ;debug_entry 1=bus,2=addr,3=illegal,4=zero,5=linea,6=linef
  5392.  
  5393. ;-------------- print if entered from debug mode ----------
  5394.  
  5395. check_debug    movem.l    d0/a0,-(a7)
  5396.         moveq    #0,d0
  5397.         move.b    debug_entry,d0
  5398.         beq.b    .nodeb
  5399.         lsl.w    #2,d0
  5400.         move.l    debug_txt(pc,d0.w),a0
  5401.         bsr    print
  5402.         sf    debug_entry
  5403. .nodeb        movem.l    (a7)+,d0/a0
  5404.         rts
  5405.  
  5406. debug_txt    dc.l 0
  5407.         dc.l .bus_txt
  5408.         dc.l .addr_txt
  5409.         dc.l .illegal_txt
  5410.         dc.l .zero_txt
  5411.         dc.l .linea_txt
  5412.         dc.l .linef_txt
  5413.  
  5414. .bus_txt    dc.b "Debug mode: Bus error",$a,0
  5415. .addr_txt    dc.b "Debug mode: Illegal address",$a,0
  5416. .illegal_txt    dc.b "Debug mode: Illegal instruction",$a,0
  5417. .zero_txt    dc.b "Debug mode: Division by zero",$a,0
  5418. .linea_txt    dc.b "Debug mode: Line-A instruction",$a,0
  5419. .linef_txt    dc.b "Debug mode: Line-F instruction",$a,0
  5420.         even
  5421.  
  5422. ;----------------------------------------------------------
  5423.  
  5424. ;NODISK_ERR        equ 1
  5425. ;TRACKCORRUPT_ERR    equ 2
  5426. ;BADCHECKSUM_ERR    equ 3
  5427. ;NOTDOS_ERR        equ 4
  5428. ;WRITEPROTECT_ERR    equ 5
  5429. ;CREATEFILE_ERR        equ 6
  5430. ;FILENOTFOUND_ERR    equ 7
  5431. ;DISKFULL_ERR        equ 8
  5432. ;FILEEXIST_ERR        equ 9
  5433. ;DEVICENOTFOUND_ERR    equ 10
  5434. ;ILLEGALPATH_ERR    equ 11
  5435. ;NOFFS_ERR        equ 12
  5436. ;IDE_ERR        equ 13
  5437. ;NOTEMPTY_ERR        equ 14
  5438.  
  5439. ;check if disk cleanup needed
  5440.  
  5441. end_disk:    movem.l    d0-a6,-(a7)
  5442.         tst.b    disk_op
  5443.         beq.w    .no_disk_op
  5444.         sf    disk_op
  5445.  
  5446.         bsr    flush_fbuffer        ;flush file buffers
  5447.         tst.b    floppy_op
  5448.         beq.b    .noflo
  5449.         sf    floppy_op
  5450.         bsr    motor_off
  5451. .noflo        clr.l    bitmap_part        ;clear bitmap buffer
  5452.  
  5453.         clr.l    file_handle1        ;free
  5454.         clr.l    file_handle2        ;both file_handle
  5455.  
  5456.         lea.l    track_sector,a0
  5457.         moveq    #-1,d1
  5458.         move.l    d1,(a0)+
  5459.         move.l    d1,(a0)+
  5460.         move.l    d1,(a0)+
  5461.         move.w    d1,track_buffer_no
  5462.  
  5463.         move.w    drive_err,d0
  5464.         beq.w    .noerr
  5465.         clr.w    drive_err
  5466.  
  5467.         lea.l    no_disk_txt,a0        ;1
  5468.         subq.w    #1,d0
  5469.         beq.w    .ok
  5470.         lea.l    corrupt_txt,a0        ;2
  5471.         subq.w    #1,d0
  5472.         beq.w    .ok
  5473.         lea.l    bad_sum_txt,a0        ;3
  5474.         subq.w    #1,d0
  5475.         beq.b    .ok
  5476.         lea.l    NotDOS_txt,a0        ;4
  5477.         subq.w    #1,d0
  5478.         beq.b    .ok
  5479.         lea.l    WriteProt_txt,a0    ;5
  5480.         subq.w    #1,d0
  5481.         beq.b    .ok
  5482.         lea.l    CreateFile_txt,a0    ;6
  5483.         subq.w    #1,d0
  5484.         beq.b    .ok
  5485.         lea.l    FileNotFound_txt,a0    ;7
  5486.         subq.w    #1,d0
  5487.         beq.b    .ok
  5488.         lea.l    DiskFull_txt,a0        ;8
  5489.         subq.w    #1,d0
  5490.         beq.b    .ok
  5491.         lea.l    FileExists_txt,a0    ;9
  5492.         subq.w    #1,d0
  5493.         beq.b    .ok
  5494.         lea.l    DeviceNotFound_txt,a0    ;10
  5495.         subq.w    #1,d0
  5496.         beq.b    .ok
  5497.         lea.l    IllegalPath_txt,a0    ;11
  5498.         subq.w    #1,d0
  5499.         beq.b    .ok
  5500.         lea.l    NoFFS_txt,a0        ;12
  5501.         subq.w    #1,d0
  5502.         beq.b    .ok
  5503.         lea.l    IDEerr_txt,a0        ;13
  5504.         subq.w    #1,d0
  5505.         beq.b    .ok
  5506.         lea.l    NotEmpty_txt,a0        ;14
  5507.  
  5508.  
  5509. ;        subq.w    #1,d0
  5510. ;        beq.b    .ok
  5511. ;        nop
  5512. .ok
  5513.         bsr    print
  5514.  
  5515. .noerr
  5516.  
  5517. .no_disk_op    movem.l    (a7)+,d0-a6
  5518.         rts
  5519.  
  5520. ;-------------- type mem ------------------------
  5521.  
  5522. cmd_type    bsr evaluate
  5523.         bne.w    illegal_addr
  5524.         move.l    d0,a0
  5525.         bsr    print
  5526.         bra.w    end_command
  5527.  
  5528. ;-------------- find ----------------------------
  5529.  
  5530. cmd_f        bsr    evaluate
  5531.         bne.w    illegal_addr
  5532.         move.l    d0,find_start
  5533.         bsr    evaluate
  5534.         bne.w    illegal_addr
  5535.         move.l    d0,find_end
  5536.         movem.l    find_start,d0-d1
  5537.         cmp.l    d0,d1
  5538.         ble.w    illegal_addr
  5539.  
  5540.         lea.l    find_list,a1
  5541.         moveq    #0,d1            ;nb bytes
  5542. .loop        clr.w    eval_size
  5543.         bsr    evaluate
  5544.         bmi.w    illegal_val
  5545.         bgt.b    .end_find
  5546.         move.w    eval_size,d2
  5547.         move.w    d2,d3
  5548. .next        addq.w    #1,d1
  5549.         move.b    d0,(a1,d2.w)
  5550.         lsr.l    #8,d0
  5551.         dbf    d2,.next
  5552.         addq.w    #1,d3
  5553.         add.w    d3,a1
  5554.         cmp.l    #find_list+80,a1
  5555.         blt.b    .loop
  5556.  
  5557. .end_find    subq.w    #1,d1
  5558.         bmi.w    illegal_val
  5559.         movem.l    find_start,a0-a1
  5560.         cmp.l    a0,a1
  5561.         ble.w    illegal_addr
  5562.  
  5563.  
  5564.         lea.l    find_list,a2
  5565.         move.b    (a2)+,d0
  5566. .seek        cmp.l    a1,a0
  5567.         bge.w    .end_seek
  5568.         tst.b    break
  5569.         bne.w    .end_seek
  5570.         move.l    a0,watch
  5571.         move.l    a0,a4
  5572.         RELOC_PIC
  5573.         addq.l    #1,a0
  5574.         cmp.b    (a4)+,d0
  5575.         bne.w    .seek
  5576.         move.w    d1,d2
  5577.         move.l    a2,a3
  5578.         bra.b    .dbf
  5579. .comp        move.b    (a3)+,d3
  5580.         cmp.b    (a4)+,d3
  5581.         bne.w    .seek
  5582. .dbf        dbf    d2,.comp
  5583.         movem.l    d0-d1/a0,-(a7)
  5584.         move.l    a0,d0
  5585.         subq.l    #1,d0
  5586.         lea.l    ev_line,a0
  5587.         move.w    #$2020,8(a0)
  5588.         clr.b    10(a0)
  5589.         moveq    #8,d1
  5590.         bsr    conv_hex
  5591.         bsr    print
  5592.         movem.l    (a7)+,d0-d1/a0
  5593.         bra.w    .seek
  5594.  
  5595. .end_seek    tst.w    cursor_x
  5596.         beq.b    .no_CR
  5597.         lea.l    cr_txt,a0
  5598.         bsr    print
  5599. .no_CR
  5600.         bra.w    end_command
  5601.  
  5602. cr_txt        dc.b $a,0
  5603.  
  5604. ;-------------- find instruction ----------------
  5605.  
  5606. cmd_fi        bsr    evaluate
  5607.         bne.w    illegal_addr
  5608.         and.w    #$fffe,d0
  5609.         move.l    d0,find_start
  5610.         bsr    evaluate
  5611.         bne.w    illegal_addr
  5612.         and.w    #$fffe,d0
  5613.         move.l    d0,find_end
  5614.  
  5615.         movem.l    find_start,d0-d1
  5616.         cmp.l    d0,d1
  5617.         ble.w    illegal_addr
  5618.  
  5619.         lea.l    find_list,a1
  5620.         bsr    read_name
  5621.         tst.b    (a1)
  5622.         beq.w    illegal_string
  5623.  
  5624. .re_jok        lea.l    find_list,a0
  5625.         cmp.b    #'*',(a0)    ;remove jokers at begining of line
  5626.         bne.b    .lower
  5627. .shift        move.b    1(a0),(a0)+
  5628.         bne.b    .shift
  5629.         bra.b    .re_jok
  5630.  
  5631. .lower        move.b    (a0),d0
  5632.         beq.b    .end_list
  5633.         bsr    lower_case
  5634.         move.b    d0,(a0)+
  5635.         bra.b    .lower
  5636.  
  5637. .end_list    movem.l    find_start,a0-a1
  5638.         cmp.l    a0,a1
  5639.         ble.w    illegal_addr
  5640.  
  5641.         move.l    a1,d7
  5642.         lea.l    ev_line,a1
  5643.         move.l    a1,d6
  5644.         lea.l    find_list,a1
  5645.         move.l    a1,d5
  5646.         moveq    #$a,d4
  5647.  
  5648. .loop2        cmp.l    d7,a0
  5649.         bge.w    .end_fi
  5650.         tst.b    break
  5651.         bne.w    .end_fi
  5652.  
  5653.         move.l    a0,watch
  5654.         move.l    a0,-(a7)
  5655.         move.l    a0,a4
  5656.         bsr    reloc_pic
  5657.         move.l    d6,a0            ;ev_line
  5658.         moveq    #%100,d0    ;lower case, no d $address,indirect
  5659.         bsr    disassemble
  5660.  
  5661.         move.l    d5,a0            ;find_list
  5662.         move.b    (a0)+,d0
  5663.         move.l    d6,a1            ;ev_line
  5664. .seek        move.b    (a1)+,d1
  5665.         cmp.b    d4,d1
  5666.         beq.w    .no_fi
  5667.         cmp.b    d0,d1
  5668.         bne.b    .seek
  5669.         move.l    a0,a2
  5670.         move.l    a1,a3
  5671. .loop        move.b    (a2)+,d2
  5672.         beq.b    .ok
  5673.         move.b    (a3)+,d1
  5674.         cmp.b    d4,d1
  5675.         beq.b    .seek
  5676.         cmp.b    #'*',d2            ;joker
  5677.         beq.b    .loop
  5678.         cmp.b    d2,d1
  5679.         beq.b    .loop
  5680.         bra.b    .seek
  5681.  
  5682. .ok
  5683.         move.l    (a7),a4
  5684.         RELOC_PIC
  5685.         move.l    d6,a0            ;ev_line
  5686.         moveq    #%111,d0    ;upper case, d $address, indirect
  5687.         bsr    disassemble
  5688.  
  5689.         move.l    d6,a0
  5690.         bsr    print            ;print disas. line
  5691.  
  5692. .no_fi        move.l    (a7)+,a0
  5693.         addq.l    #2,a0
  5694.         bra.w    .loop2
  5695.  
  5696. .end_fi
  5697.         bra.w    end_command
  5698.  
  5699. ;-------------- find instruction famicom -------------
  5700.  
  5701. cmd_fif        bsr    evaluate
  5702.         bne.w    illegal_addr
  5703.         move.l    d0,find_start
  5704.         bsr    evaluate
  5705.         bne.w    illegal_addr
  5706.         move.l    d0,find_end
  5707.  
  5708.         movem.l    find_start,d0-d1
  5709.  
  5710.         lea.l    find_list,a1
  5711.         bsr    read_name
  5712.         tst.b    (a1)
  5713.         beq.w    illegal_string
  5714.  
  5715.         lea.l    find_list,a0
  5716. .upper        move.b    (a0),d0
  5717.         beq.b    .end_list
  5718.         bsr    upper_case
  5719.         move.b    d0,(a0)+
  5720.         bra.b    .upper
  5721.  
  5722. .end_list    movem.l    find_start,a0-a1
  5723.         cmp.l    a0,a1
  5724.         ble.w    illegal_addr
  5725.  
  5726.         move.l    a1,d7
  5727.         lea.l    ev_line+10,a1
  5728.         move.l    a1,d6
  5729.         lea.l    find_list,a1
  5730.         move.l    a1,d5
  5731.         moveq    #$a,d4
  5732.  
  5733. .loop2        cmp.l    d7,a0
  5734.         bge.w    .end_fi
  5735.         tst.b    break
  5736.         bne.w    .end_fi
  5737.  
  5738.         move.l    a0,watch
  5739.         move.l    a0,-(a7)
  5740.         move.l    a0,a4
  5741.         RELOC_PIC
  5742.         move.l    d6,a0            ;ev_line+10
  5743.         bsr    f_disassemble
  5744.  
  5745.         move.l    d5,a0            ;find_list
  5746.         move.b    (a0)+,d0
  5747.         move.l    d6,a1            ;ev_line+10
  5748. .seek        move.b    (a1)+,d1
  5749.         cmp.b    d4,d1
  5750.         beq.b    .no_fi
  5751.         cmp.b    d0,d1
  5752.         bne.b    .seek
  5753.         move.l    a0,a2
  5754.         move.l    a1,a3
  5755. .loop        move.b    (a2)+,d2
  5756.         beq.b    .ok
  5757.         move.b    (a3)+,d1
  5758.         cmp.b    d4,d1
  5759.         beq.b    .seek
  5760.         cmp.b    d2,d1
  5761.         beq.b    .loop
  5762.         bra.b    .seek
  5763.  
  5764. .ok        move.l    (a7),d0
  5765.         moveq    #8,d1
  5766.         lea.l    ev_line,a0
  5767.         move.b    #' ',9(a0)
  5768.         move.b    #' ',(a0)+
  5769.         bsr    conv_hex
  5770.         lea.l    ev_line,a0
  5771.         bsr    print
  5772. .no_fi        move.l    (a7)+,a0
  5773.         addq.l    #1,a0
  5774.         bra.w    .loop2
  5775.  
  5776. .end_fi
  5777.         bra.w    end_command
  5778.  
  5779. ;-------------- change drive no -----------------
  5780. cmd_drive    bsr    evaluate
  5781.         bmi.w    illegal_val
  5782.         beq.b    .chg
  5783.         moveq    #0,d0
  5784.         move.w    drive,d0
  5785.         subq.w    #3,d0
  5786. .chg        moveq    #1,d1
  5787.         cmp.l    d1,d0
  5788.         bgt.w    illegal_val
  5789.         tst.l    d0
  5790.         bmi.w    illegal_val
  5791.         lea.l    drive_present,a0
  5792.         tst.b    (a0,d0.w)        ;drive is present ?
  5793.         beq.w    illegal_val
  5794.         addq.w    #3,d0
  5795.         move.w    d0,drive
  5796.         subq.b    #3,d0
  5797.         lea.l    drive_txt,a0
  5798.         bsr    print
  5799.         moveq    #1,d1
  5800.         bsr    print_hexCR
  5801.         bra.w    end_command
  5802.  
  5803. ;-------------- exit monitor --------------------
  5804.  
  5805. cmd_x        st    escape
  5806.         bra.w    end_command
  5807.  
  5808.  
  5809. ;-------------- KILL --------------------------------------
  5810.  
  5811. cmd_kill    st    escape
  5812.         st    kill
  5813.  
  5814.         bra.w    end_command
  5815.  
  5816. ;-------------- REBOOT ------------------------------------
  5817.  
  5818. cmd_reboot
  5819.         bsr    remove_pic
  5820.  
  5821.         move.l    $4.w,a0
  5822.         move.l    a0,d0
  5823.         lsr.l    #1,d0
  5824.         bcs.w    .nosafe
  5825.         lea.l    34(a0),a1
  5826.         moveq    #0,d0
  5827.         moveq    #$18-1,d1
  5828. .add        add.w    (a1)+,d0
  5829.         dbf    d1,.add
  5830.         not.w    d0
  5831.         cmp.w    82(a0),d0
  5832.         bne.w    .nosafe
  5833.  
  5834.         bsr    set_pic
  5835.  
  5836.         lea.l    surereboot_txt(pc),a0
  5837.         bsr    print
  5838.         bsr    get_key
  5839.         lea.l    sure2_txt(pc),a0
  5840.         bsr    print
  5841.         cmp.b    #'y',d0
  5842.         bne.b    .no
  5843.  
  5844.         bsr    remove_pic
  5845.  
  5846.         move.l    $4.w,a0
  5847.         clr.l    ColdCapture(a0)
  5848.         move.l    #cool-start+$48000,CoolCapture(a0)
  5849.  
  5850.         st    reboot
  5851.  
  5852.         lea.l    34(a0),a1
  5853.         moveq    #0,d0
  5854.         moveq    #$18-1,d1
  5855. .add2        add.w    (a1)+,d0
  5856.         dbf    d1,.add2
  5857.         not.w    d0
  5858.         move.w    d0,82(a0)
  5859.  
  5860.         move.l    $f80004,a0
  5861.         subq.l    #2,a0
  5862.         move.l    a0,pc_reg
  5863.         move.w    #$2700,sr_reg
  5864.         st    escape
  5865.  
  5866.         bsr    set_pic
  5867.  
  5868. .no        bra.w    end_command
  5869.  
  5870. .nosafe        lea.l    nosafe_txt(pc),a0
  5871.         bsr    print
  5872.         bra.w    end_command
  5873.  
  5874. nosafe_txt    dc.b "HRTmon can't reboot and stay resident !",$a
  5875.         dc.b "You have to perform this operation when ExecBase is still valid !",$a,0
  5876.  
  5877. surereboot_txt    dc.b "The machine will reboot!",$a
  5878.         dc.b "HRTmon will still be accessible to debug bootdisks",$a
  5879.         dc.b "Are you sure you want to continue ? (y/n)",$d,0
  5880.         even
  5881.  
  5882.  
  5883. cool        movem.l    d1-a6,-(a7)
  5884.  
  5885.         move.l    $4.w,a0
  5886.         clr.l    CoolCapture(a0)
  5887.         lea.l    34(a0),a1
  5888.         moveq    #0,d0
  5889.         moveq    #$18-1,d1
  5890. .add        add.w    (a1)+,d0
  5891.         dbf    d1,.add
  5892.         not.w    d0
  5893.         move.w    d0,82(a0)
  5894.  
  5895.         lea.l    $48000,a0
  5896.         lea.l    start,a1
  5897.         move.l    a1,a2
  5898.         move.l    #(end-start),d0
  5899.         lsr.l    #3,d0
  5900. .copy        move.l    (a0)+,(a1)+        ;restore HRTmon to its place
  5901.         move.l    (a0)+,(a1)+
  5902.         dbf    d0,.copy
  5903.  
  5904.         move.l    $4.w,a6
  5905.         jsr    -636(a6)        ;clear cache
  5906.  
  5907.         jmp    .next
  5908.  
  5909. .next        move.l    $4.w,a6
  5910.         lea.l    .super(pc),a5
  5911.         jsr    -30(a6)
  5912.  
  5913.         move.l    mon_size(pc),d0
  5914.         beq.b    .noalloc
  5915.         lea.l    start,a1
  5916.         jsr    -204(a6)
  5917.         tst.l    d0
  5918.         bne.b    .noalloc
  5919.         clr.l    mon_size        ;alloc failed
  5920. .noalloc
  5921.         sf    entered
  5922.  
  5923.  
  5924. ;.wait        move.w    $dff006,d0
  5925. ;        and.w    #$ff,d0
  5926. ;        move.w    #0,$dff106
  5927. ;        move.w    d0,$dff180
  5928. ;        btst    #6,$bfe001
  5929. ;        bne.b    .wait
  5930.  
  5931.         movem.l    (a7)+,d1-a6
  5932.         moveq    #0,d0
  5933.         rts
  5934.  
  5935.     MC68030
  5936. .super        movec    VBR,a4
  5937.         move.l    a4,old_vbr
  5938.         lea.l    new_except,a0
  5939.  
  5940.         move.l    a0,a1
  5941.         lea.l    except_entry(pc),a2
  5942.         move.w    #$400/4-1,d1
  5943. .init        move.l    a2,(a1)+
  5944.         dbf    d1,.init
  5945.  
  5946.         suba.l    a1,a1
  5947.         move.w    #$400/4-1,d1
  5948. .copy2        move.l    (a4)+,(a1)+
  5949.         dbf    d1,.copy2
  5950.  
  5951.         move.l    $7c(a0),oldlev7
  5952.         move.l    #monitor,$7c(a0)
  5953.         movec    a0,VBR
  5954.  
  5955.         rte
  5956.     MC68000
  5957.  
  5958. ;-------------- restart program at address ------
  5959.  
  5960. cmd_g        bsr    evaluate
  5961.         bmi.w    illegal_addr
  5962.         bne.b    .noaddr
  5963.         move.l    d0,pc_reg
  5964. .noaddr        st    escape
  5965.         bra.w    end_command
  5966.  
  5967. ;-------------- Load AmigaDOS file --------------
  5968.  
  5969. cmd_l        lea.l    ev_line,a1
  5970.         bsr    read_name
  5971.         tst.b    (a1)
  5972.         beq.w    illegal_name
  5973.  
  5974.         bsr    evaluate
  5975.         bne.w    illegal_addr
  5976.         tst.l    d0
  5977.         bmi.w    illegal_addr
  5978.         move.l    d0,d4
  5979.  
  5980.         bsr    remove_pic
  5981.  
  5982.         move.l    #ev_line,d1
  5983.         moveq    #0,d2            ;old file
  5984.         bsr    open_file
  5985.         move.l    d0,d7
  5986.         beq.b    .noopen
  5987.         move.l    d4,d2
  5988.         move.l    d7,a1
  5989.         move.l    file_size(a1),d3
  5990.         move.l    d3,d6
  5991.         move.l    d3,d1
  5992.         add.l    d2,d1            ;end address
  5993.         move.l    d2,d0
  5994.         move.l    d7,d1
  5995.         bsr    read_file
  5996. .bad        move.l    d7,d1
  5997.         bsr    close_file
  5998.  
  5999. .noopen        bsr    set_pic
  6000.  
  6001.         tst.w    drive_err
  6002.         bne.b    .end
  6003.  
  6004.         lea.l    file_len_txt,a0
  6005.         bsr    print
  6006.         moveq    #8,d1
  6007.         move.l    d6,d0
  6008.         bsr    print_hexCR
  6009.  
  6010. .end        bra.w    end_command
  6011.  
  6012. ;-------------- cd dir --------------------------
  6013.  
  6014. cmd_cd        lea.l    ev_line,a1
  6015.         bsr    read_name
  6016.         tst.b    (a1)
  6017.         beq.b    .nochg
  6018.  
  6019.         move.l    #ev_line,d1
  6020.         bsr    change_dir
  6021.  
  6022. .nochg        lea.l    ev_line,a0
  6023.         sf    (a0)
  6024.         move.l    a0,d1
  6025.         bsr    ExNext
  6026.         tst.l    d0
  6027.         bmi.b    .err
  6028.  
  6029.         move.l    d1,a3            ;partition
  6030.         move.l    d2,d0            ;parent block no
  6031.         bsr    print_path        ;path
  6032.  
  6033. .err        bra.w    end_command
  6034.  
  6035. ;-------------- dir -----------------------------
  6036.  
  6037. cmd_dir        lea.l    ev_line,a1
  6038.         bsr    read_name
  6039.  
  6040.         moveq    #0,d6            ;nb files printed
  6041.  
  6042.         move.l    #ev_line,d1
  6043.         bsr    ExNext
  6044.         tst.l    d0
  6045.         bmi.w    .err
  6046.  
  6047.         move.l    d0,-(a7)
  6048.         move.l    d1,a3            ;partition
  6049.         move.l    d2,d0            ;parent block no
  6050.         bsr    print_path        ;path
  6051.         move.l    (a7)+,d0
  6052.  
  6053.         tst.l    d0            ;empty dir ?
  6054.         beq.w    .err
  6055.  
  6056. .loop        addq.l    #1,d6
  6057.         move.l    d0,a1
  6058.         lea.l    general_txt,a0
  6059.         move.b    #' ',d0
  6060.         move.l    a0,a2
  6061.         moveq    #31-1,d2
  6062. .fill        move.b    d0,(a2)+
  6063.         dbf    d2,.fill
  6064.         sf    (a2)
  6065.  
  6066.         lea.l    file_name(a1),a2
  6067.         moveq    #0,d0
  6068.         move.b    (a2)+,d0        ;get file name size
  6069.         bra.b    .godbf
  6070. .copyn        move.b    (a2)+,(a0)+
  6071. .godbf        dbf    d0,.copyn
  6072.         lea.l    general_txt,a0
  6073.         bsr    print            ;print filename
  6074.  
  6075.         tst.b    file_dir(a1)
  6076.         beq.b    .okfile
  6077.         lea.l    dir_txt,a0
  6078.         bsr    print
  6079.         bra.b    .okdir
  6080. .okfile        move.l    file_size(a1),d0
  6081.         moveq    #7,d1
  6082.         bsr    print_dec
  6083.  
  6084. .okdir        lea.l    spc_txt,a0
  6085.         bsr    print
  6086.  
  6087.         move.l    d6,d0        ;nb files printed in d0
  6088.         move.w    screen_height,d1
  6089.         subq.w    #5,d1
  6090.         lsl.w    #1,d1
  6091.         divu    d1,d0        ;pause after 46(PAL) files printed
  6092.         swap    d0
  6093.         tst.w    d0
  6094.         bne.b    .no46
  6095.         bsr    get_key        ;wait for key pressed
  6096. .no46
  6097.         tst.b    break
  6098.         bne.b    .err
  6099.  
  6100.         move.l    a1,d1
  6101.         bsr    ExNext
  6102.         tst.l    d0
  6103.         bgt.w    .loop
  6104.  
  6105. .err        lsr.l    #1,d6
  6106.         bcc.b    .nocr
  6107.         lea.l    cr_txt,a0
  6108.         bsr    print
  6109.  
  6110. .nocr
  6111.         bra.w    end_command
  6112.  
  6113. dir_txt        dc.b "   (DIR)",0
  6114. spc_txt        dc.b " ",0
  6115.         even
  6116.  
  6117. ;-------------- calculate BootBlock checksum --------------
  6118.  
  6119. cmd_bb        bsr    evaluate
  6120.         bne.w    illegal_addr
  6121.         move.l    d0,a0
  6122.         move.l    a0,a1
  6123.         clr.l    4(a1)
  6124.  
  6125.         moveq    #0,d0
  6126.         move.w    #512*2/4-1,d1
  6127. .add        add.l    (a0)+,d0
  6128.         bcc.b    .noc
  6129.         addq.l    #1,d0
  6130. .noc        dbf    d1,.add
  6131.         not.l    d0
  6132.  
  6133.         move.l    d0,4(a1)
  6134.  
  6135.         bra.w    end_command
  6136.  
  6137. ;-------------- floppy access -------------------
  6138.  
  6139. cmd_disk1    move.b    #'R',d0
  6140.         bra.b    go_disk
  6141. cmd_disk2    move.b    #'W',d0
  6142. go_disk        move.b    d0,rwsec
  6143.  
  6144.         bsr    evaluate
  6145.         bne.w    illegal_addr
  6146.         move.l    d0,sec_addr
  6147.         bsr    evaluate
  6148.         bne.w    illegal_val
  6149.         tst.l    d0
  6150.         bmi.w    illegal_val
  6151.         cmp.l    #1759,d0
  6152.         bgt.w    illegal_val
  6153.         move.w    d0,strtsec
  6154.         move.l    d0,d1
  6155.  
  6156.         bsr    evaluate
  6157.         bne.w    illegal_val
  6158.         tst.l    d0
  6159.         bmi.w    illegal_val
  6160.         move.w    d0,nbsec
  6161.         add.l    d0,d1
  6162.         cmp.l    #1760,d1
  6163.         bgt.w    illegal_val
  6164.  
  6165.         move.l    sec_addr,d0
  6166.         move.w    nbsec,d1
  6167.         mulu    #512,d1
  6168.         add.l    d0,d1
  6169.  
  6170.         bsr    remove_pic
  6171.  
  6172.         bsr    test_present
  6173.         bne.b    .end_write
  6174.  
  6175.         move.l    sec_addr,a0
  6176.         movem.w    strtsec,d0-d1
  6177.         cmp.b    #'W',rwsec
  6178.         bne.b    .no_write
  6179.  
  6180.         bsr    write2
  6181.  
  6182.         bsr    force_change
  6183.  
  6184.         bra.b    .end_write
  6185.  
  6186. .no_write    bsr    read2
  6187. .end_write    bsr    set_pic
  6188.         bra.w    end_command
  6189.  
  6190. ;----------------------------------------------------------
  6191. ;-------------- test if a disk is present -----------------
  6192. ;-------------- if disk changed then flush track_buffer ---
  6193. ;-------------- used by non FileSystem commands (RS,WS...)-
  6194.  
  6195. ;<- FLAGS 0=ok_present
  6196.  
  6197. test_present    movem.l    d0/a3,-(a7)
  6198.         lea.l    floppy0,a3
  6199.         cmp.w    #3,drive
  6200.         beq.b    .go0
  6201.         lea.l    floppy1,a3
  6202. .go0        moveq    #0,d0            ;test cmd
  6203.         bsr    floppy_change
  6204.         tst.w    drive_err
  6205.         movem.l    (a7)+,d0/a3
  6206.         rts
  6207.  
  6208. ;--------------------------------------------------------------------
  6209. ;-------------- force change_disk to floppy selected in 'drive' -----
  6210.  
  6211. ;-> drive
  6212.  
  6213. force_change    movem.l    d0/a2-a3,-(a7)
  6214.         lea.l    floppy0,a3
  6215.         cmp.w    #3,drive
  6216.         beq.b    .f0
  6217.         cmp.w    #4,drive
  6218.         bne.b    .end
  6219.         lea.l    floppy1,a3
  6220. .f0        move.l    part_device(a3),a2
  6221.         clr.l    part_filesystem(a3)
  6222.         moveq    #1,d0            ;force change cmd
  6223.         jsr    CHANGE_CMD(a2)
  6224.         clr.l    bitmap_part        ;clear bitmap buffer
  6225. .end        movem.l    (a7)+,d0/a2-a3
  6226.         rts
  6227.  
  6228. ;-------------- disk check ----------------------
  6229.  
  6230. cmd_diskchk
  6231.  
  6232.         moveq    #0,d6
  6233.         move.w    #160-1,d7
  6234. .check        move.l    d6,d0
  6235.         lea.l    fbuf1,a0
  6236.         bsr    read_fsector
  6237.         tst.w    drive_err
  6238.         bne.b    .error
  6239.         tst.b    break
  6240.         bne.b    .error
  6241.         add.w    #11,d6
  6242.         dbf    d7,.check
  6243.  
  6244.         lea.l    .ok_txt(pc),a0
  6245.         bsr    print
  6246.  
  6247. .error
  6248.         bsr    force_change
  6249.  
  6250.         bra.w    end_command
  6251.  
  6252. .ok_txt        dc.b "Floppy disk is OK.",$a,0
  6253.  
  6254. ;-------------- format disk ---------------------
  6255.  
  6256. fconfirm1_txt    dc.b "Format disk in drive ",0
  6257. fconfirm2_txt    dc.b " (y/n) ?",$d,0
  6258.         even
  6259.  
  6260. cmd_format    lea.l    ev_line,a1
  6261.         bsr.w    read_name
  6262.  
  6263.         lea.l    fconfirm1_txt,a0
  6264.         bsr    print
  6265.         move.w    drive,d0
  6266.         subq.w    #3,d0
  6267.         moveq    #1,d1
  6268.         bsr    print_dec
  6269.         lea.l    fconfirm2_txt,a0
  6270.         bsr    print
  6271.  
  6272.         bsr    get_key
  6273.         lea.l    diskclr_txt(pc),a0
  6274.         bsr    print
  6275.         cmp.b    #'y',d0
  6276.         bne.w    .endformat
  6277.  
  6278.         bsr    test_present
  6279.         bne.w    .endformat
  6280.  
  6281.         lea.l    $40000,a0        ;dummy addr for format
  6282.         moveq    #0,d0
  6283.         moveq    #-1,d1            ;format all disk
  6284.         moveq    #-1,d7            ;write
  6285.         bsr    access
  6286.  
  6287.         tst.b    break
  6288.         bne.b    .break
  6289.  
  6290.         lea.l    format_block,a0
  6291.         lea.l    secbuf,a1
  6292.         moveq    #512/16-1,d0
  6293. .copy        move.l    (a0)+,(a1)+
  6294.         move.l    (a0)+,(a1)+
  6295.         move.l    (a0)+,(a1)+
  6296.         move.l    (a0)+,(a1)+
  6297.         dbf    d0,.copy
  6298.  
  6299.         lea.l    ev_line,a1
  6300.         tst.b    (a1)
  6301.         beq.w    .no_set
  6302.         move.l    a1,d1            ;source name (ended by a zero)
  6303.         lea.l    secbuf+108*4,a2        ;dest BCPL
  6304.         bsr    copy_name2
  6305. .no_set
  6306.         lea.l    secbuf,a0
  6307.         bsr    calc_sum
  6308.         move.w    #880,d0
  6309.         bsr    write_fsector
  6310.         lea.l    format_block+512,a0
  6311.         move.w    #881,d0
  6312.         bsr    write_fsector
  6313.         bsr    write_flush
  6314.  
  6315. .break        bsr    force_change
  6316.  
  6317. .endformat
  6318.  
  6319.         bra.w    end_command
  6320.  
  6321. ;-------------- FORMATQ ------------------------
  6322. cmd_formatq    lea.l    ev_line,a1
  6323.         bsr.w    read_name
  6324.  
  6325.         lea.l    fconfirm1_txt,a0
  6326.         bsr    print
  6327.         move.w    drive,d0
  6328.         subq.w    #3,d0
  6329.         moveq    #1,d1
  6330.         bsr    print_dec
  6331.         lea.l    fconfirm2_txt,a0
  6332.         bsr    print
  6333.  
  6334.         bsr    get_key
  6335.         lea.l    diskclr_txt(pc),a0
  6336.         bsr    print
  6337.         cmp.b    #'y',d0
  6338.         bne.w    .endformat
  6339.  
  6340.         bsr    test_present
  6341.         bne.w    .endformat
  6342.  
  6343.         lea.l    format_block,a0
  6344.         lea.l    secbuf,a1
  6345.         moveq    #512/16-1,d0
  6346. .copy        move.l    (a0)+,(a1)+
  6347.         move.l    (a0)+,(a1)+
  6348.         move.l    (a0)+,(a1)+
  6349.         move.l    (a0)+,(a1)+
  6350.         dbf    d0,.copy
  6351.  
  6352.         lea.l    ev_line,a1
  6353.         tst.b    (a1)
  6354.         beq.b    .no_set
  6355.         move.l    a1,d1            ;source name (ended by a zero)
  6356.         lea.l    secbuf+108*4,a2        ;dest BCPL
  6357.         bsr    copy_name2
  6358. .no_set
  6359.         lea.l    secbuf,a0
  6360.         bsr    calc_sum
  6361.         move.w    #880,d0
  6362.         bsr    write_fsector
  6363.         lea.l    format_block+512,a0
  6364.         move.w    #881,d0
  6365.         bsr    write_fsector
  6366.  
  6367.         lea.l    secbuf,a0
  6368.         move.l    a0,a1
  6369.         moveq    #512/4-1,d0
  6370. .clr        clr.l    (a1)+
  6371.         dbf    d0,.clr
  6372.         move.l    #$444f5301,(a0)        ;'DOS',1 (FFS)
  6373.         moveq    #0,d0
  6374.         bsr    write_fsector
  6375.  
  6376.         bsr    write_flush
  6377.  
  6378.         bsr    force_change
  6379.  
  6380. .endformat
  6381.         bra.w    end_command
  6382.  
  6383. ;-------------- evaluate expression -------------
  6384. cmd_ev        bsr    evaluate
  6385.         bne.w    illegal_expr
  6386.  
  6387.         lea.l    ev_line,a0
  6388.         move.b    #'$',(a0)+
  6389.         moveq    #8,d1
  6390.         bsr    conv_hex
  6391.         addq.l    #8,a0
  6392.         moveq    #$20,d6
  6393.         move.b    d6,(a0)+
  6394.  
  6395.         moveq    #10,d1
  6396.         bsr    conv_dec
  6397.  
  6398.         move.b    d6,(a0)+
  6399.         move.b    #'"',(a0)+
  6400.         moveq    #0,d1
  6401.         lea.l    ascIIx,a1
  6402.         rol.l    #8,d0
  6403.         move.b    d0,d1
  6404.         move.b    (a1,d1.w),(a0)+
  6405.         rol.l    #8,d0
  6406.         move.b    d0,d1
  6407.         move.b    (a1,d1.w),(a0)+
  6408.         rol.l    #8,d0
  6409.         move.b    d0,d1
  6410.         move.b    (a1,d1.w),(a0)+
  6411.         rol.l    #8,d0
  6412.         move.b    d0,d1
  6413.         move.b    (a1,d1.w),(a0)+
  6414.         move.b    #'"',(a0)+
  6415.  
  6416.         move.b    d6,(a0)+
  6417.  
  6418.         move.b    #'%',(a0)+
  6419.         moveq    #4-1,d2
  6420. .loop3        moveq    #8-1,d1
  6421. .loop2        addx.l    d0,d0
  6422.         bcc.b    .zero
  6423.         move.b    #'1',(a0)+
  6424.         bra.b    .un
  6425. .zero        move.b    #'0',(a0)+
  6426. .un        dbf    d1,.loop2
  6427.         move.b    #'.',(a0)+
  6428.         dbf    d2,.loop3
  6429.         subq.l    #1,a0
  6430.         move.b    #$a,(a0)+
  6431.         clr.b    (a0)+
  6432.  
  6433.         lea.l    ev_line,a0
  6434.         bsr    print
  6435.  
  6436.         bra.w    end_command
  6437.  
  6438. ;-------------- direct keyboard read (without IRQ) -------
  6439.  
  6440. ;<- dkey
  6441.  
  6442. get_dkey    movem.l    d0-d2,-(a7)
  6443.         move.b    $bfed01,d0
  6444.         btst    #3,d0
  6445.         beq.b    no_dkey
  6446.         move.b    $bfec01,d0
  6447.         not.b    d0
  6448.         ror.b    #1,d0
  6449.         bset    #6,$bfee01
  6450.         cmp.b    #$78,d0
  6451.         beq.w    go_reset
  6452.         moveq    #8-1,d1
  6453. .wait        move.b    6(a6),d2
  6454. .ras        cmp.b    6(a6),d2
  6455.         beq.b    .ras
  6456.         dbf    d1,.wait
  6457.         bclr    #6,$bfee01
  6458.         move.b    d0,dkey
  6459. no_dkey        movem.l    (a7)+,d0-d2
  6460.         rts
  6461.  
  6462. ;-------------- show registres (R) --------------
  6463. cmd_r
  6464. seek_reg    move.b    (a0)+,d0
  6465.         beq.w    end_chg_reg
  6466.         cmp.b    #$20,d0
  6467.         beq.b    seek_reg
  6468.         subq.l    #1,a0
  6469.  
  6470.         bsr    read_reg    ;read registre (no of reg in d0)
  6471.         move.w    d0,d5        ;save no registre in d5
  6472.         bmi.w    illegal_reg
  6473.  
  6474. seek_reg_val    move.b    (a0)+,d0
  6475.         beq.w    illegal_val
  6476.         cmp.b    #$20,d0
  6477.         beq.b    seek_reg_val
  6478.         subq.l    #1,a0
  6479.  
  6480.         bsr    evaluate
  6481.         bne.w    illegal_val
  6482.  
  6483.         cmp.w    #16,d5
  6484.         blt.b    ok_simple_reg
  6485. ;-----------------------------------------------
  6486.         bne.b    no_pc_chg
  6487.         move.l    d0,pc_reg
  6488.         bra.b    end_chg_reg
  6489. ;-----------------------------------------------
  6490. no_pc_chg    cmp.w    #19,d5
  6491.         bne.b    no_usp_chg
  6492.         move.l    d0,usp_reg
  6493. ;-----------------------------------------------
  6494. no_usp_chg    cmp.w    #20,d5
  6495.         bne.b    no_ssp_chg
  6496.         move.l    d0,ssp_reg
  6497. ;-----------------------------------------------
  6498. no_ssp_chg    cmp.w    #17,d5
  6499.         bne.b    no_sr_chg
  6500.         move.w    d0,sr_reg
  6501.         bra.b    end_chg_reg
  6502. ;-----------------------------------------------
  6503. no_sr_chg    cmp.w    #18,d5
  6504.         bne.b    no_vbr_chg
  6505.         move.l    d0,vbr_reg
  6506.         bra.b    end_chg_reg
  6507. ;-----------------------------------------------
  6508. no_vbr_chg    cmp.w    #21,d5
  6509.         bne.b    no_cacr_chg
  6510.         move.l    d0,cacr_reg
  6511.         bra.b    end_chg_reg
  6512. ;-----------------------------------------------
  6513. no_cacr_chg    cmp.w    #22,d5
  6514.         bne.b    no_pcr_chg
  6515.         move.l    d0,msp_reg
  6516.         bra.b    end_chg_reg
  6517. ;-----------------------------------------------
  6518. no_pcr_chg    cmp.w    #23,d5
  6519.         bne.b    no_busr_chg
  6520.         move.l    d0,caar_reg
  6521.         bra.b    end_chg_reg
  6522. ;-----------------------------------------------
  6523. no_busr_chg
  6524.         bra.b    end_chg_reg
  6525.  
  6526. ok_simple_reg    lea.l    registres,a0
  6527.         lsl.w    #2,d5
  6528.         move.l    d0,(a0,d5.w)
  6529.  
  6530. end_chg_reg    bsr    print_reg
  6531.         bra.w    end_command
  6532.  
  6533. ;-------------- print all registres -------------
  6534.  
  6535. print_reg    movem.l    d0-d1/a0-a1/a4,-(a7)
  6536.         moveq    #8,d1
  6537.         lea.l    registres,a1
  6538.         move.l    (a1)+,d0
  6539.         lea.l    data0_reg+3,a0
  6540.         bsr    conv_hex
  6541.         move.l    (a1)+,d0
  6542.         lea.l    data0_reg+3+9,a0
  6543.         bsr    conv_hex
  6544.         move.l    (a1)+,d0
  6545.         lea.l    data0_reg+3+18,a0
  6546.         bsr    conv_hex
  6547.         move.l    (a1)+,d0
  6548.         lea.l    data0_reg+3+27,a0
  6549.         bsr    conv_hex
  6550.         move.l    (a1)+,d0
  6551.         lea.l    data4_reg,a0
  6552.         bsr    conv_hex
  6553.         move.l    (a1)+,d0
  6554.         lea.l    data4_reg+9,a0
  6555.         bsr    conv_hex
  6556.         move.l    (a1)+,d0
  6557.         lea.l    data4_reg+18,a0
  6558.         bsr    conv_hex
  6559.         move.l    (a1)+,d0
  6560.         lea.l    data4_reg+27,a0
  6561.         bsr    conv_hex
  6562.  
  6563.         move.l    (a1)+,d0
  6564.         lea.l    addr0_reg+3,a0
  6565.         bsr    conv_hex
  6566.         move.l    (a1)+,d0
  6567.         lea.l    addr0_reg+3+9,a0
  6568.         bsr    conv_hex
  6569.         move.l    (a1)+,d0
  6570.         lea.l    addr0_reg+3+18,a0
  6571.         bsr    conv_hex
  6572.         move.l    (a1)+,d0
  6573.         lea.l    addr0_reg+3+27,a0
  6574.         bsr    conv_hex
  6575.         move.l    (a1)+,d0
  6576.         lea.l    addr4_reg,a0
  6577.         bsr    conv_hex
  6578.         move.l    (a1)+,d0
  6579.         lea.l    addr4_reg+9,a0
  6580.         bsr    conv_hex
  6581.         move.l    (a1)+,d0
  6582.         lea.l    addr4_reg+18,a0
  6583.         bsr    conv_hex
  6584.         move.l    (a1)+,d0
  6585.         lea.l    addr4_reg+27,a0
  6586.         bsr    conv_hex
  6587.  
  6588.         move.l    pc_reg,d0
  6589.         lea.l    pc_txt+3,a0
  6590.         bsr    conv_hex
  6591.         move.l    ssp_reg,d0
  6592.         lea.l    ssp_txt+4,a0
  6593.         bsr    conv_hex
  6594.         move.l    usp_reg,d0
  6595.         lea.l    usp_txt+4,a0
  6596.         bsr    conv_hex
  6597.         move.l    vbr_reg,d0
  6598.         lea.l    vbr_txt+4,a0
  6599.         bsr    conv_hex
  6600.  
  6601.         move.l    cacr_reg,d0
  6602.         lea.l    CACR_txt+5,a0
  6603.         bsr    conv_hex
  6604.         move.l    caar_reg,d0
  6605.         lea.l    CAAR_txt+5,a0
  6606.         bsr    conv_hex
  6607.         move.l    msp_reg,d0
  6608.         lea.l    MSP_txt+4,a0
  6609.         bsr    conv_hex
  6610.         move.l    isp_reg,d0
  6611.         lea.l    ISP_txt+4,a0
  6612.         bsr    conv_hex
  6613.  
  6614.         lea.l    sr_txt+3,a0
  6615.         moveq    #4,d1
  6616.         move.w    sr_reg,d0
  6617.         bsr    conv_hex
  6618.  
  6619.         move.l    a7_reg,a0
  6620.         and.w    #$2000,d0
  6621.         beq.b    no_superv_stack
  6622.         addq.l    #6,a0
  6623.         move.l    a0,a4
  6624.         bsr    reloc_pic
  6625.         move.w    (a4),d0            ;stack frame
  6626.         lsr.w    #4,d0
  6627.         lsr.w    #8,d0
  6628.         add.w    d0,d0
  6629.         lea.l    frame,a4
  6630.         add.w    (a4,d0.w),a0
  6631. no_superv_stack    move.l    pc_reg,a4
  6632.         bsr    reloc_pic
  6633.         move.b    #'S',rts_txt+2
  6634.         cmp.w    #$4e73,(a4)        ;cmp if RTE
  6635.         bne.b    no_rte
  6636.         addq.l    #2,a0            ;jmp SR for RTE
  6637.         move.b    #'E',rts_txt+2
  6638. no_rte        move.l    a0,a4
  6639.         bsr    reloc_pic
  6640.         move.l    (a4),d0            ;read RTS address
  6641.         lea.l    rts_txt+4,a0
  6642.         moveq    #8,d1
  6643.         bsr    conv_hex
  6644.  
  6645.         lea.l    registre_txt,a0
  6646.         bsr    print
  6647.  
  6648.         jsr    init_regBMON
  6649.  
  6650.         movem.l    (a7)+,d0-d1/a0-a1/a4
  6651.         rts
  6652.  
  6653. frame        dc.w 2,2,6,2,2,2,2,2,22,14,24,40,2,2,2 ;all stack frame size
  6654.  
  6655.  
  6656. ********************************************************************
  6657. ;-------------- print single instruction at dis_ptr  ---------------
  6658.  
  6659. ;d0 returns instruction len
  6660.  
  6661. single_inst    movem.l    d1-d7/a0-a4,-(a7)
  6662.  
  6663.         move.l    dis_ptr,a4
  6664.         bsr    reloc_pic
  6665.  
  6666.         lea.l    general_txt,a0
  6667.         moveq    #7,d0        ;upper case, d $address, indir. address
  6668.         bsr    disassemble
  6669.         lea.l    general_txt,a0
  6670.         bsr    print
  6671.  
  6672.         movem.l    (a7)+,d1-d7/a0-a4
  6673.         rts
  6674.  
  6675. ***************************************************************
  6676. ;-------------- hex dump (H) ---------------------
  6677.  
  6678. cmd_h        moveq    #0,d1
  6679. seek_para_h    move.b    (a0)+,d0
  6680.         beq.w    ok_h_cmd        ;keep last address
  6681.         cmp.b    #$20,d0
  6682.         beq.b    seek_para_h
  6683.         subq.l    #1,a0
  6684.  
  6685.         bsr    evaluate        ;returns address in d0
  6686.         bne.w    illegal_addr
  6687.         move.l    d0,hex_ptr
  6688.  
  6689.         move.l    d0,a3
  6690.  
  6691. .loop        move.b    (a0)+,d0
  6692.         beq.w    ok_h_cmd
  6693.         cmp.b    #"'",d0
  6694.         beq.b    ok_h_ascII
  6695.         cmp.b    #$20,d0
  6696.         beq.b    .loop
  6697.         subq.l    #1,a0
  6698.         st    label
  6699.         move.w    #1,eval_size    ;set .W par default
  6700.         bsr    evaluate
  6701.         beq.b    .oky
  6702.         sf    label
  6703.         bra.w    illegal_val
  6704. .oky        sf    label
  6705.         move.l    a3,a4
  6706.         bsr    reloc_pic
  6707.         move.w    eval_size,d2
  6708. .next        move.b    d0,(a4,d2.w)
  6709.         lsr.l    #8,d0
  6710.         addq.l    #1,a3
  6711.         dbf    d2,.next
  6712.         st    d1
  6713.         bra.b    .loop
  6714.  
  6715. ok_h_ascII    tst.b    d1
  6716.         bne.b    ok_h_cmd
  6717.         move.l    hex_ptr,a3
  6718. .loop        move.b    (a0)+,d0
  6719.         beq.b    ok_h_cmd
  6720.         cmp.b    #"'",d0
  6721.         beq.b    ok_h_cmd
  6722.         move.l    a3,a4
  6723.         bsr    reloc_pic
  6724.         move.b    d0,(a4)
  6725.         st    d1
  6726.         addq.l    #1,a3
  6727.         bra.b    .loop
  6728.  
  6729. ok_h_cmd    tst.b    d1
  6730.         bne.w    end_command
  6731.         move.l    hex_ptr,a4        ;a4=mem ptr
  6732.         move.l    a4,d0
  6733.  
  6734.         moveq    #8-1,d3            ;print 8 lines
  6735.         moveq    #15,d5
  6736.  
  6737. .loop2        bsr    make_hex_line
  6738.  
  6739.         lea.l    16(a4),a4
  6740.         lea.l    hex_txt,a0
  6741.         bsr    print
  6742.  
  6743.         tst.b    break
  6744.         dbne    d3,.loop2
  6745.  
  6746.         move.l    a4,hex_ptr
  6747.  
  6748.         bra.w    end_command
  6749.  
  6750. ;-------------- up arrow cmd ---------------
  6751.  
  6752. ;-> d2 = scroll step (1 or SC_STEP)
  6753.  
  6754. cmdu_h        move.l    ascII_ptr,a0
  6755.         move.w    d2,d0
  6756.         mulu    #80,d0
  6757.         add.l    d0,a0
  6758.         cmp.w    #'h ',(a0)    ;last top line was an hex dump ?
  6759.         bne.b    .noh
  6760.         addq.l    #2,a0
  6761.         bsr    evaluate    ;get last address
  6762.         move.l    d2,d1
  6763.         lsl.l    #4,d1        ;*16
  6764.         sub.l    d1,d0
  6765.         move.l    d0,a4
  6766.  
  6767.         subq.w    #1,d2
  6768. .print        bsr    make_hex_line
  6769.         lea.l    16(a4),a4
  6770.         lea.l    hex_txt,a0
  6771.         bsr    print
  6772.         dbf    d2,.print
  6773.  
  6774.         clr.w    2(a3)
  6775. ;        lea.l    hex_txt2,a1
  6776. ;        move.b    #$d,18(a1)
  6777. ;        move.b    #$a,18(a1)
  6778.  
  6779.         moveq    #0,d0
  6780.  
  6781. .noh        rts
  6782.  
  6783. ;-------------- down arrow cmd -------------
  6784.  
  6785. cmdd_h        move.l    ascII_ptr,a0
  6786.         move.w    window_bot,d0
  6787.         subq.w    #1,d0
  6788.         sub.w    d2,d0
  6789.         mulu    #80,d0
  6790.         add.l    d0,a0
  6791.         cmp.w    #'h ',(a0)    ;last line was an hex dump ?
  6792.         bne.b    .noh
  6793.         addq.l    #2,a0
  6794.         bsr    evaluate    ;get last address
  6795.         add.l    #16,d0
  6796.         move.l    d0,a4
  6797.  
  6798.         sub.w    d2,(2,a3)
  6799.  
  6800.         subq.w    #1,d2
  6801. .print        bsr    make_hex_line
  6802.         lea.l    hex_txt,a0
  6803.         bsr    print
  6804.         lea.l    16(a4),a4
  6805.         dbf    d2,.print
  6806.  
  6807.         move.l    a4,hex_ptr
  6808.  
  6809.         moveq    #0,d0
  6810.  
  6811. .noh        rts
  6812.  
  6813.  
  6814. ;-> a4=address to dump
  6815. ;<- hex_txt is filled with the dump text
  6816.  
  6817. make_hex_line    movem.l    d0-a4,-(a7)
  6818.         moveq    #$0f,d5
  6819.  
  6820.         move.l    a4,d0
  6821.         bsr    reloc_pic
  6822.  
  6823.         lea.l    ascIIx,a1
  6824.         lea.l    hex_list,a3
  6825.  
  6826.         lea.l    hex_txt+3,a0    ;print address
  6827.         moveq    #8,d1
  6828.         bsr    conv_hex
  6829.  
  6830.         lea.l    hex_txt+3+8+2,a0        ;long list
  6831.         lea.l    hex_txt2+1,a2        ;ascII print
  6832.         moveq    #2,d1                ;2 for conv_hex
  6833.         moveq    #0,d0
  6834.         moveq    #8-1,d6
  6835. .loopb        moveq    #2-1,d2
  6836. .loop        move.b    (a4)+,d0
  6837.         move.b    (a1,d0.w),(a2)+
  6838.         move.w    d0,d4
  6839.         and.w    d5,d4
  6840.         lsr.w    #4,d0
  6841.         move.b    (a3,d0.w),(a0)+
  6842.         move.b    (a3,d4.w),(a0)+
  6843.         dbf    d2,.loop
  6844.         addq.l    #2,a0
  6845.         dbf    d6,.loopb
  6846.  
  6847.         movem.l    (a7)+,d0-a4
  6848.         rts
  6849.  
  6850. ***************************************************************
  6851. ;-------------- ascII dump (n) ---------------------
  6852. cmd_n
  6853. seek_para_n    move.b    (a0)+,d0
  6854.         beq.b    ok_n_cmd        ;keep last address
  6855.         cmp.b    #$20,d0
  6856.         beq.b    seek_para_n
  6857.         subq.l    #1,a0
  6858.  
  6859.         bsr    evaluate        ;returns address in d0
  6860.         bne.w    illegal_addr
  6861.         move.l    d0,asc_ptr
  6862.  
  6863. ok_n_cmd    move.l    asc_ptr,a4        ;a4=mem ptr
  6864.         move.l    a4,d0
  6865.  
  6866.         moveq    #8-1,d3            ;print 8 lines
  6867.  
  6868. .loop2        moveq    #$a,d0
  6869.         bsr    make_ascII_line
  6870.  
  6871.         lea.l    general_txt,a0
  6872.         bsr    print
  6873.         lea.l    64(a4),a4
  6874.  
  6875.         tst.b    break
  6876.         dbne    d3,.loop2
  6877.  
  6878.         move.l    a4,asc_ptr
  6879.  
  6880.         bra.w    end_command
  6881.  
  6882. ;-------------- scroll up ascII dump ----------------------
  6883.  
  6884. cmdu_n        move.l    ascII_ptr,a0
  6885.         move.w    d2,d0
  6886.         mulu    #80,d0
  6887.         add.l    d0,a0
  6888.         cmp.w    #'n ',(a0)    ;last top line was an ascII dump ?
  6889.         bne.b    .non
  6890.         addq.l    #2,a0
  6891.         bsr    evaluate    ;get last address
  6892.         move.l    d2,d1
  6893.         lsl.l    #6,d1        ;*64
  6894.         sub.l    d1,d0
  6895.         move.l    d0,a4
  6896.  
  6897.         subq.w    #1,d2
  6898.  
  6899. .print        moveq    #$a,d0
  6900.         bsr    make_ascII_line
  6901.  
  6902.         lea.l    general_txt,a0
  6903.         bsr    print
  6904.  
  6905.         lea.l    64(a4),a4
  6906.  
  6907.         dbf    d2,.print
  6908.  
  6909.         clr.w    (2,a3)
  6910.  
  6911.         moveq    #0,d0
  6912.  
  6913. .non        rts
  6914.  
  6915. ;-------------- scroll down ascII dump --------------------
  6916.  
  6917. cmdd_n        move.l    ascII_ptr,a0
  6918.         move.w    window_bot,d0
  6919.         subq.w    #1,d0
  6920.         sub.w    d2,d0
  6921.         mulu    #80,d0
  6922.         add.l    d0,a0
  6923.         cmp.w    #'n ',(a0)    ;last line was an ascII dump ?
  6924.         bne.b    .non
  6925.         addq.l    #2,a0
  6926.         bsr    evaluate    ;get last address
  6927.         add.l    #64,d0
  6928.         move.l    d0,a4
  6929.  
  6930.         sub.w    d2,(2,a3)
  6931.  
  6932.         subq.w    #1,d2
  6933.  
  6934. .print        moveq    #$a,d0
  6935.         bsr    make_ascII_line
  6936.  
  6937.         lea.l    general_txt,a0
  6938.         bsr    print
  6939.  
  6940.         lea.l    64(a4),a4
  6941.  
  6942.         dbf    d2,.print
  6943.  
  6944.         move.l    a4,asc_ptr
  6945.  
  6946.  
  6947.         moveq    #0,d0
  6948.  
  6949. .non        rts
  6950.  
  6951.  
  6952. ;-> a4=mem ptr
  6953. ;-> d0=end line ascII ($a or $d)
  6954. ;<- general_txt filled with ascII line
  6955.  
  6956. make_ascII_line    movem.l    d0-a4,-(a7)
  6957.         move.b    d0,d7
  6958.         lea.l    ascIIx,a1
  6959.         move.l    a4,d0
  6960.         bsr    reloc_pic
  6961.  
  6962.         lea.l    general_txt,a0
  6963.         move.b    #'n',(a0)+
  6964.         move.b    #' ',(a0)+
  6965.         move.b    #'$',(a0)+
  6966.         moveq    #8,d1
  6967.         bsr    conv_hex
  6968.  
  6969.         lea.l    8(a0),a0
  6970.         move.b    #' ',(a0)+
  6971.         moveq    #0,d0
  6972.         moveq    #64-1,d2
  6973. .loop        move.b    (a4)+,d0
  6974.         move.b    (a1,d0.w),(a0)+
  6975.         dbf    d2,.loop
  6976.  
  6977.         move.b    d7,(a0)+
  6978.         sf    (a0)+
  6979.  
  6980.         movem.l    (a7)+,d0-a4
  6981.         rts
  6982.  
  6983. *********************************************************************
  6984. ;check address accessed and if needed relocate the HRTmon bitmap mem.
  6985. ;(bitmap is either at $20000 or at $60000)
  6986.  
  6987. ;-> a4=address accessed
  6988.  
  6989. reloc_pic:
  6990.         cmp.l    #$40000,a4
  6991.         bcs.b    .low
  6992. ;-------------- bitmap needs to be in $20000 ---------
  6993.         cmp.l    #$20000,pic_ptr
  6994.         beq.b    .ok_corr
  6995.         tst.b    pic_status
  6996.         bne.b    .pic_on1
  6997.         move.l    #$20000,pic_ptr
  6998.         bra.b    .ok_corr
  6999. .pic_on1    bsr    remove_pic
  7000.         move.l    #$20000,pic_ptr
  7001.         bsr    set_pic
  7002.         bra.b    .ok_corr
  7003.  
  7004. ;-------------- bitmap needs to be in $60000 ---------
  7005. .low        cmp.l    #$60000,pic_ptr
  7006.         beq.b    .ok_corr
  7007.         tst.b    pic_status
  7008.         bne.b    .pic_on2
  7009.         move.l    #$60000,pic_ptr
  7010.         bra.b    .ok_corr
  7011. .pic_on2    bsr    remove_pic
  7012.         move.l    #$60000,pic_ptr
  7013.         bsr    set_pic
  7014.  
  7015. .ok_corr    rts
  7016.  
  7017.  
  7018. ***************************************************
  7019. ;-------------- trace mode ------------------------
  7020. cmd_t        move.b    (a0)+,d0
  7021.         beq.w    single_trace
  7022.         cmp.b    #$20,d0
  7023.         beq.b    cmd_t
  7024.         bsr    upper_case
  7025.         cmp.b    #'A',d0
  7026.         bne.b    no_trace_a
  7027. ;-------------- trace till address reached -----
  7028. seek_tracea    move.b    (a0)+,d0
  7029.         beq.w    illegal_addr
  7030.         cmp.b    #$20,d0
  7031.         beq.b    seek_tracea
  7032.         subq.l    #1,a0
  7033.         bsr    evaluate
  7034.         bne.w    illegal_addr
  7035.         btst    #0,d0
  7036.         bne.w    illegal_addr
  7037.         move.l    d0,trace_address
  7038.         st    escape
  7039.         bra.w    end_command
  7040. ;-------------- trace x steps -----------
  7041. no_trace_a    subq.l    #1,a0
  7042.         bsr    evaluate
  7043.         bne.w    illegal_val
  7044.         tst.l    d0
  7045.         beq.w    illegal_val
  7046.         cmp.l    #$10000,d0
  7047.         bge.w    illegal_val
  7048. init_trace    move.w    d0,trace_count
  7049.         st    escape
  7050.         bra.w    end_command
  7051.  
  7052. single_trace    moveq    #1,d0
  7053.         bra.b    init_trace
  7054.  
  7055. ;---------------------------------------
  7056. trace_reach    move.l    a0,-(a7)
  7057.         lea.l    trace_count,a0
  7058.         subq.w    #1,(a0)
  7059.         beq.b    end_trace_mode
  7060.         move.l    (a7)+,a0
  7061.         or.w    #$8000,(a7)
  7062.         rte
  7063. end_trace_mode    move.l    vbr_reg,a0
  7064.         move.l    old_trace,$24(a0)
  7065.         move.l    (a7)+,a0
  7066.         and.w    #$7fff,(a7)
  7067.         bra.w    monitor
  7068. ;---------------------------------------------
  7069. tracea_reach    move.l    d0,-(a7)
  7070.         move.l    trace_address,d0
  7071.         cmp.l    2+4(a7),d0
  7072.         beq.b    end_tracea
  7073.         move.l    (a7)+,d0
  7074.         or.w    #$8000,(a7)
  7075.         rte
  7076. end_tracea    move.l    (a7)+,d0
  7077.         move.l    a0,-(a7)
  7078.         move.l    vbr_reg,a0
  7079.         move.l    old_trace,$24(a0)
  7080.         lea.l    trace_address,a0
  7081.         move.l    #-1,(a0)
  7082.         move.l    (a7)+,a0
  7083.         and.w    #$7fff,(a7)
  7084.         bra.w    monitor
  7085.  
  7086. ***************************************************
  7087. ;-------------- copy memory -----------------------
  7088. ;-------------- and exg (CE) memory ---------------
  7089.  
  7090. cmd_c        move.b    (a0),d0
  7091.         bsr    upper_case
  7092.         sf    exgc
  7093.         cmp.b    #'E',d0
  7094.         bne.b    no_exgc
  7095.         st    exgc
  7096.         addq.l    #1,a0
  7097.  
  7098. no_exgc        move.b    (a0)+,d0
  7099.         beq.w    illegal_addr
  7100.         cmp.b    #$20,d0
  7101.         beq.b    no_exgc
  7102.         subq.l    #1,a0
  7103.         bsr    evaluate
  7104.         bne.w    illegal_addr
  7105.         move.l    d0,copy_start
  7106.  
  7107. seek_end_copy    move.b    (a0)+,d0
  7108.         beq.w    illegal_addr
  7109.         cmp.b    #$20,d0
  7110.         beq.b    seek_end_copy
  7111.         subq.l    #1,a0
  7112.  
  7113.         bsr    evaluate
  7114.         bne.w    illegal_addr
  7115.         move.l    d0,copy_end
  7116.  
  7117. seek_dest_copy    move.b    (a0)+,d0
  7118.         beq.w    illegal_addr
  7119.         cmp.b    #$20,d0
  7120.         beq.b    seek_dest_copy
  7121.         subq.l    #1,a0
  7122.  
  7123.         bsr    evaluate
  7124.         bne.w    illegal_addr
  7125.         move.l    d0,copy_dest
  7126.  
  7127.         movem.l    copy_start,d0-d1
  7128.         sub.l    d0,d1                ;length
  7129.         move.l    copy_dest,d0
  7130.         add.l    d0,d1
  7131.         movem.l    copy_start,d0-d1
  7132.         cmp.l    d0,d1
  7133.         ble.w    illegal_addr            ;if end<start
  7134.  
  7135.         move.l    d0,a0
  7136.         move.l    d1,a2
  7137.         move.l    copy_dest,a1
  7138.  
  7139.         bsr    remove_pic
  7140.  
  7141.         moveq    #0,d0
  7142.         move.l    d0,$180(a6)
  7143.  
  7144.         tst.b    exgc
  7145.         beq.b    do_copy_mem
  7146.  
  7147. do_copye_mem    move.b    (a0),d0
  7148.         move.b    (a1),(a0)+
  7149.         move.b    d0,(a1)+
  7150.         cmp.l    a2,a0
  7151.         blt.b    do_copye_mem
  7152.         bra.b    end_copy
  7153.  
  7154. do_copy_mem    move.b    (a0)+,(a1)+
  7155.         cmp.l    a2,a0
  7156.         blt.b    do_copy_mem
  7157.  
  7158. end_copy    bsr    set_pic
  7159.  
  7160.         bra.w    end_command
  7161.  
  7162. ***************************************************
  7163. ;-------------- break point set -------------------
  7164. cmd_b        move.b    (a0)+,d0
  7165.         beq.w    illegal_addr
  7166.         bsr    upper_case
  7167.         moveq    #0,d7
  7168.         cmp.b    #'J',d0
  7169.         bne.w    no_jmp_break
  7170.         moveq    #-1,d7            ;jsr break mode on
  7171.         bra.b    seek_break
  7172.  
  7173. no_jmp_break    cmp.b    #'D',d0
  7174.         bne.b    no_del_break
  7175.         lea.l    break_list,a0
  7176.         moveq    #-1,d0
  7177. do_clr_all_BP    tst.l    (a0)
  7178.         bmi.b    cleared_all_BP
  7179.         clr.l    (a0)
  7180.         move.w    d0,4(a0)
  7181.         move.l    d0,6(a0)
  7182.         lea.l    10(a0),a0
  7183.         bra.b    do_clr_all_BP
  7184. cleared_all_BP    lea.l    all_BP_txt,a0
  7185.         bsr    print
  7186.         bra.w    end_command
  7187. ;-------------------------------------------
  7188.  
  7189. no_del_break    subq.l    #1,a0
  7190. seek_break    move.b    (a0)+,d0
  7191.         beq.w    print_break
  7192.         cmp.b    #$20,d0
  7193.         beq.b    seek_break
  7194.         subq.l    #1,a0
  7195.  
  7196.         bsr    evaluate
  7197.         bne.w    illegal_addr
  7198.         btst    #0,d0
  7199.         bne.w    illegal_addr
  7200.         move.l    d0,a2
  7201.  
  7202. ;-------------- check if clear BP command ------------
  7203.         lea.l    break_list,a1
  7204. seek_clear_BP    tst.l    (a1)
  7205.         bmi.b    end_clear_BP
  7206.         cmp.l    (a1),a2
  7207.         beq.b    pre_clear_BP
  7208.         lea.l    10(a1),a1
  7209.         bra.b    seek_clear_BP
  7210. pre_clear_BP    cmp.w    #-1,4(a1)
  7211.         bne.w    do_clear_BP
  7212.         lea.l    10(a1),a1
  7213.         bra.b    seek_clear_BP
  7214.  
  7215. ;-------------- add BP to list -----------------------
  7216.  
  7217. end_clear_BP    lea.l    break_list,a1
  7218. seek_free_break    tst.l    (a1)
  7219.         bmi.w    too_break
  7220.         tst.l    (a1)
  7221.         bne.b    break_used
  7222.         cmp.w    #-1,4(a1)
  7223.         beq.b    ok_break
  7224. break_used    lea.l    10(a1),a1
  7225.         bra.b    seek_free_break
  7226.  
  7227. ok_break    tst.l    d7
  7228.         beq.b    no_jsrb_set
  7229.         move.l    a2,(a1)            ;save address
  7230.         move.l    a2,a4
  7231.         bsr    reloc_pic
  7232.         move.w    (a4),4(a1)        ;save instr.
  7233.         move.l    2(a4),6(a1)        ;save param.
  7234.         moveq    #8,d1
  7235.         move.l    a2,d0
  7236.         lea.l    BPJ_set_txt,a0
  7237.         bsr    print
  7238.         bsr    print_hexCR
  7239.         bra.b    ok_jsrb_set
  7240.  
  7241. no_jsrb_set    move.l    a2,(a1)
  7242.         move.l    a2,a4
  7243.         bsr    reloc_pic
  7244.         move.w    (a4),4(a1)        ;save instr.
  7245.  
  7246.         moveq    #8,d1
  7247.         move.l    a2,d0
  7248.         lea.l    BP_set_txt,a0
  7249.         bsr    print
  7250.         bsr    print_hexCR
  7251.  
  7252. ok_jsrb_set
  7253.         bra.w    end_command
  7254. ;-------------- do clear BP command -----------------------
  7255.  
  7256. do_clear_BP    move.w    4(a1),(a2)
  7257.         clr.l    (a1)
  7258.         move.l    6(a1),d0
  7259.         cmp.l    #-1,d0
  7260.         beq.b    no_jsrb_clr
  7261.         move.l    d0,2(a2)
  7262. no_jsrb_clr    move.l    #-1,6(a1)
  7263.         move.w    #-1,4(a1)
  7264.         moveq    #8,d1
  7265.         move.l    a2,d0
  7266.         lea.l    BP_clr_txt,a0
  7267.         bsr    print
  7268.         bsr    print_hexCR
  7269.         bra.w    end_command
  7270.  
  7271. ;-------------- init break points when exiting HRTmon -----
  7272. init_break    movem.l    d0-d2/a0-a2,-(a7)
  7273.         sf    break_mode
  7274.         sf    BP_reach
  7275.         sf    BPJ_reach
  7276.         sf    BPatPC
  7277.         lea.l    break_list,a0
  7278. set_BP        tst.l    (a0)
  7279.         bmi.b    end_set_BP
  7280.         bne.b    set_break
  7281.         cmp.w    #-1,4(a0)
  7282.         bne.b    set_break
  7283.         lea.l    10(a0),a0
  7284.         bra.b    set_BP
  7285. set_break    cmp.l    #-1,6(a0)
  7286.         beq.b    no_BJSR_set
  7287.         move.l    (a0),a1
  7288.         move.w    #$4eb9,(a1)        ;JSR
  7289.         lea.l    JSR_reach,a2
  7290.         move.l    a2,2(a1)
  7291.         bra.b    end_BJ_set
  7292. no_BJSR_set    move.l    (a0),a1
  7293.         cmp.l    pc_reg,a1
  7294.         bne.b    .notpc
  7295.         st    BPatPC
  7296.         move.w    #1,trace_count
  7297.         bra.b    end_BJ_set
  7298. .notpc        move.w    #$4afc,(a1)
  7299.         st    break_mode
  7300. end_BJ_set    lea.l    10(a0),a0
  7301.         bra.b    set_BP
  7302. end_set_BP    tst.b    break_mode
  7303.         beq.b    no_break_mode
  7304.         move.l    vbr_reg,a0
  7305.         move.l    $10(a0),illegal_except
  7306.         lea.l    break_reach,a2
  7307.         move.l    a2,$10(a0)
  7308. no_break_mode    movem.l    (a7)+,d0-d2/a0-a2
  7309.         rts
  7310.  
  7311. ;-------------- remove all breakpoints from mem. -----
  7312. clear_break    movem.l    a0-a1,-(a7)
  7313.         lea.l    break_list,a0
  7314. do_clr_BP    tst.l    (a0)
  7315.         bmi.w    end_clear_BPa
  7316.         bne.b    ok_clr_BP
  7317.         cmp.w    #-1,4(a0)
  7318.         beq.b    no_clr_BP
  7319. ok_clr_BP    move.l    (a0),a1
  7320.         move.w    4(a0),(a1)
  7321.         cmp.l    #-1,6(a0)
  7322.         beq.b    no_clr_BP
  7323.         move.l    6(a0),2(a1)
  7324. no_clr_BP    lea.l    10(a0),a0
  7325.         bra.b    do_clr_BP
  7326. end_clear_BPa    movem.l    (a7)+,a0-a1
  7327.         rts
  7328.  
  7329. ;----------------------------------------------
  7330.  
  7331. break_reach    movem.l    a0-a1/a5,-(a7)
  7332.         move.l    2+12(a7),a0        ;fetch PC
  7333.         sf    BP_reach
  7334.         lea.l    break_list,a1
  7335. seek_BP_reach    tst.l    (a1)
  7336.         bmi.b    break_not_found
  7337.         bne.b    do_check_BP
  7338.         cmp.w    #-1,4(a1)
  7339.         beq.b    no_check_BP
  7340. do_check_BP    cmp.l    (a1),a0
  7341.         beq.b    found_break
  7342. no_check_BP    lea.l    10(a1),a1
  7343.         bra.b    seek_BP_reach
  7344.  
  7345. found_break    move.w    4(a1),(a0)        ;restore old instr.
  7346.         clr.l    (a1)
  7347.         move.w    #-1,4(a1)        ;clear old BP
  7348.         move.l    a0,Break_Address
  7349.         st    BP_reach
  7350.         movem.l    (a7)+,a0-a1/a5
  7351.         bra    monitor            ;enter monitor
  7352.  
  7353. break_not_found    movem.l    (a7)+,a0-a1/a5
  7354.         move.l    illegal_except,-(a7)
  7355.         rts                ;jmp old illegal
  7356.  
  7357. ;----------------------------------------------------------
  7358.  
  7359. JSR_reach    movem.l    a2,-(a7)
  7360.         lea.l    JB_save,a2
  7361.         movem.l    a0-a1,(a2)
  7362.         movem.l    (a7)+,a2
  7363.         movem.l    (a7)+,a0
  7364.         lea.l    Break_Address,a1
  7365.         move.l    a0,(a1)
  7366.         move.l    vbr_reg,a1
  7367.         move.l    $80(a1),.oldtrap0
  7368.         lea.l    .JB_sup(pc),a0
  7369.         move.l    a0,$80(a1)
  7370.         trap    #0
  7371. .oldtrap0    dc.l    0
  7372. .JB_sup        move.l    .oldtrap0,$80(a1)
  7373.         move.l    Break_Address,a0    ;fetch break_address
  7374.         subq.l    #6,a0            ;sub len jsr address
  7375.         lea.l    BPJ_reach,a1
  7376.         sf    (a1)
  7377.         lea.l    break_list,a1
  7378. seek_BPJ_reach    tst.l    (a1)
  7379.         bmi.b    bj_not_found
  7380.         bne.b    do_check_BPJ
  7381.         cmp.w    #-1,4(a1)
  7382.         beq.b    no_check_BPJ
  7383. do_check_BPJ    cmp.l    (a1),a0
  7384.         beq.b    found_breakJ
  7385. no_check_BPJ    lea.l    10(a1),a1
  7386.         bra.b    seek_BPJ_reach
  7387.  
  7388. found_breakJ    move.w    4(a1),(a0)        ;restore old instr.
  7389.         move.l    6(a1),2(a0)
  7390.         clr.l    (a1)
  7391.         move.w    #-1,4(a1)        ;clear old BP
  7392.         move.l    #-1,6(a1)
  7393.         move.l    a0,Break_Address
  7394.         st    BPJ_reach
  7395.         movem.l    JB_save,a0-a1
  7396.         move.l    Break_Address,2(a7)
  7397.         bra.w    monitor        ;enter monitor
  7398.  
  7399. bj_not_found    move.l    Break_Address,2(a7)
  7400.         movem.l    JB_save,a0-a1
  7401.         rte
  7402.  
  7403. ;--------------------------------------------------
  7404. print_break    lea.l    break_list,a1
  7405.         moveq    #8,d1
  7406. do_break_all    tst.l    (a1)
  7407.         bmi.b    end_break_all
  7408.         bne.b    ok_break_all
  7409.         cmp.w    #-1,4(a1)
  7410.         beq.b    no_break_all
  7411. ok_break_all    tst.l    6(a1)
  7412.         bmi.b    no_Bjsr_prt
  7413.         move.l    (a1),d0
  7414.         lea.l    all_break2_txt,a0
  7415.         bra.b    ok_Bjsr_prt
  7416.  
  7417. no_Bjsr_prt    move.l    (a1),d0
  7418.         lea.l    all_break_txt,a0
  7419. ok_Bjsr_prt    bsr    print
  7420.         bsr    print_hexCR
  7421.  
  7422. no_break_all    lea.l    10(a1),a1
  7423.         bra.b    do_break_all
  7424.  
  7425. end_break_all    bra.w    end_command
  7426.  
  7427. ***************************************************
  7428. ;-------------- disassemble (D) -------------------
  7429.  
  7430. cmd_d:        move.b    (a0)+,d0
  7431.         beq.b    ok_d_cmd        ;keep last address
  7432.         cmp.b    #$20,d0
  7433.         beq.b    cmd_d
  7434.         subq.l    #1,a0
  7435.  
  7436.         bsr    evaluate
  7437.         bne.w    illegal_addr
  7438.         btst    #0,d0            ;address must be even
  7439.         bne.w    illegal_addr
  7440.         move.l    d0,dis_ptr
  7441.  
  7442. ok_d_cmd    move.l    dis_ptr,d0        ;a4 = ptr on memory
  7443.         and.w    #$fffe,d0        ;even addr.
  7444.         move.l    d0,a4
  7445.  
  7446.         moveq    #8-1,d7
  7447. next_dis_line
  7448.         move.l    a4,-(a7)
  7449.         bsr    reloc_pic
  7450.  
  7451.         lea.l    general_txt,a0
  7452.         moveq    #7,d0            ;upper case, d $address
  7453.         bsr    disassemble
  7454.         move.l    (a7)+,a4
  7455.         add.w    d0,a4            ;add instr len
  7456.  
  7457.         lea.l    general_txt,a0
  7458.         bsr    print
  7459.  
  7460.         tst.b    break
  7461.         dbne    d7,next_dis_line
  7462.  
  7463.         move.l    a4,dis_ptr
  7464.  
  7465.         bra.w    end_command
  7466.  
  7467. ;-------------- scroll up disassemble --------
  7468.  
  7469. cmdu_d        move.l    ascII_ptr,a0
  7470.         lea.l    80(a0),a0
  7471.         cmp.w    #'D ',(a0)    ;last top line was a disassemble ?
  7472.         bne.w    .nod
  7473.         addq.l    #2,a0
  7474.         bsr    evaluate    ;get last address
  7475.         move.l    d0,d6        ;d6=address of next instr.
  7476.         move.l    d0,d5
  7477.         sub.l    #20,d5        ;d5=address to test
  7478.  
  7479. .loop        move.l    d5,a4
  7480.         bsr    reloc_pic
  7481.         moveq    #7,d0
  7482.         lea.l    general_txt,a0
  7483.         bsr    disassemble
  7484.         add.l    d5,d0
  7485.         cmp.l    d0,d6        ;right len of instr ?
  7486.         beq.b    .ok
  7487.  
  7488.         move.l    d0,d5
  7489.         cmp.l    d6,d5        ;reach end of area to test
  7490.         blt.b    .loop
  7491.  
  7492. ;---- couldn't find an instr. with the right length -> print 'dc.w'
  7493.  
  7494.         lea.l    general_txt,a0
  7495.         move.w    #"D ",(a0)+
  7496.         move.b    #"$",(a0)+
  7497.         move.l    d6,d0
  7498.         subq.l    #2,d0
  7499.         moveq    #8,d1
  7500.         bsr    conv_hex
  7501.         add.l    d1,a0
  7502.         move.b    #" ",(a0)+
  7503.         move.l    #"Dc.W",(a0)+
  7504.         move.w    #" $",(a0)+
  7505.         move.l    d6,a4
  7506.         bsr    reloc_pic
  7507.         move.w    (a4),d0
  7508.         moveq    #4,d1
  7509.         bsr    conv_hex
  7510.         add.l    d1,a0
  7511.         move.w    #$0a00,(a0)+
  7512.         bra.w    .ok
  7513.  
  7514. .ok        move.l    d5,d0
  7515.  
  7516.         lea.l    general_txt,a0
  7517.         bsr    print
  7518.         subq.w    #1,(2,a3)        ;cursor one line up
  7519.  
  7520.         moveq    #0,d0
  7521.  
  7522. .nod        rts
  7523.  
  7524. .bad_addr    lea.l    illegal_addr_txt,a0
  7525.         bsr    print
  7526.         bra.b    .nod
  7527.  
  7528. ;-------------- scroll down disassemble ---------
  7529.  
  7530. cmdd_d        move.l    ascII_ptr,a0
  7531.         move.l    d0,-(a7)
  7532.         move.w    window_bot,d0
  7533.         subq.w    #2,d0
  7534.         mulu    #80,d0
  7535.         add.l    d0,a0
  7536.         move.l    (a7)+,d0
  7537.         cmp.w    #'D ',(a0)    ;last line was a disassemble ?
  7538.         bne.b    .nod
  7539.         addq.l    #2,a0
  7540.         bsr    evaluate    ;get last address
  7541.         move.l    d0,d6
  7542.         move.l    d0,a4
  7543.         bsr    reloc_pic
  7544.         moveq    #0,d0
  7545.         lea.l    general_txt,a0
  7546.         bsr    disassemble    ;calc last instr size
  7547.         add.l    d6,d0
  7548.         move.l    d0,a4
  7549.         move.l    d0,d6
  7550.         bsr    reloc_pic
  7551.         moveq    #7,d0
  7552.         lea.l    general_txt,a0
  7553.         bsr    disassemble
  7554.         add.l    d0,d6            ;add instr. size
  7555.         move.l    d6,dis_ptr        ;next instr. address
  7556.  
  7557.         subq.w    #1,(2,a3)        ;cursor one line up
  7558.         lea.l    general_txt,a0
  7559.         bsr    print
  7560.  
  7561.         moveq    #0,d0
  7562.  
  7563. .nod        rts
  7564.  
  7565.  
  7566.         include src/65816.s
  7567.  
  7568. ***********************************************************
  7569. ;-------------- error routines ---------------------
  7570.  
  7571. illegal_syntax    lea.l    illegal_syntax_txt,a0
  7572.         bsr    print
  7573.         bra.w    end_command
  7574.  
  7575. illegal_val    lea.l    illegal_val_txt,a0
  7576.         bsr    print
  7577.         bra.w    end_command
  7578.  
  7579. illegal_reg    lea.l    illegal_reg_txt,a0
  7580.         bsr    print
  7581.         bra.w    end_command
  7582.  
  7583. illegal_addr    lea.l    illegal_addr_txt,a0
  7584.         bsr    print
  7585.         bra.w    end_command
  7586.  
  7587. illegal_name    lea.l    illegal_name_txt,a0
  7588.         bsr    print
  7589.         bra.w    end_command
  7590.  
  7591. illegal_string    lea.l    illegal_string_txt,a0
  7592.         bsr    print
  7593.         bra.w    end_command
  7594.  
  7595. illegal_expr    lea.l    illegal_expr_txt,a0
  7596.         bsr    print
  7597.         bra.w    end_command
  7598.  
  7599. too_break    lea.l    too_break_txt,a0
  7600.         bsr    print
  7601.         bra.w    end_command
  7602.  
  7603. not_found    lea.l    not_found_txt,a0
  7604.         bsr    print
  7605.         bra.w    end_command
  7606.  
  7607. *********************************************************
  7608. ;d0=ascII
  7609. upper_case:    cmp.b    #'a',d0            ;switch to upper case (d0)
  7610.         blt.b    .ok_upper
  7611.         cmp.b    #'z',d0
  7612.         bgt.b    .ok_upper
  7613.         add.b    #'A'-'a',d0
  7614. .ok_upper    rts
  7615.  
  7616. ;d0=ascII
  7617. lower_case    cmp.b    #'A',d0            ;switch to lower case (d0)
  7618.         blt.b    .ok_lower
  7619.         cmp.b    #'Z',d0
  7620.         bgt.b    .ok_lower
  7621.         add.b    #'a'-'A',d0
  7622. .ok_lower    rts
  7623.  
  7624. ;d1=ascII
  7625. upper_case1    cmp.b    #'a',d1            ;switch to upper case (d1)
  7626.         blt.b    .ok_upper
  7627.         cmp.b    #'z',d1
  7628.         bgt.b    .ok_upper
  7629.         add.b    #'A'-'a',d1
  7630. .ok_upper    rts
  7631.  
  7632. ************************************************************
  7633. ;read string at a0 and copy it in a1 (0=end of string)
  7634. ;' ' can surround a string
  7635.  
  7636. read_name    movem.l    d0/a1,-(a7)
  7637. .loop        cmp.b    #$20,(a0)+
  7638.         beq.b    .loop
  7639.         subq.l    #1,a0
  7640.         cmp.b    #"'",(a0)
  7641.         bne.b    .colle
  7642.         addq.l    #1,a0
  7643. .loop2        move.b    (a0)+,d0
  7644.         beq.b    .err
  7645.         cmp.b    #"'",d0
  7646.         bne.b    .g1
  7647.         cmp.b    #"'",(a0)
  7648.         bne.b    .end_n
  7649.         addq.l    #1,a0
  7650. .g1        move.b    d0,(a1)+
  7651.         bra.b    .loop2
  7652. .end_n        clr.b    (a1)+
  7653.         movem.l    (a7)+,d0/a1
  7654.         rts
  7655.  
  7656. .colle        move.b    (a0)+,d0
  7657.         beq.b    .err
  7658.         cmp.b    #$20,d0
  7659.         beq.b    .end_n
  7660.         move.b    d0,(a1)+
  7661.         bra.b    .colle
  7662.  
  7663. .err        movem.l    (a7)+,d0/a1
  7664.         clr.b    (a1)
  7665.         rts
  7666.  
  7667. *************************************************************
  7668. ;-> a0=ptr on ascII number
  7669. ;<- returns number in d0
  7670.  
  7671. read_number    movem.l    d1-d3/a1,-(a7)
  7672. .spc        cmp.b    #$20,(a0)+
  7673.         beq.b    .spc
  7674.         subq.l    #1,a0
  7675.         st    ok_numb
  7676.         sf    minus
  7677.         cmp.b    #'-',(a0)
  7678.         bne.b    .no_minus
  7679.         st    minus
  7680.         addq.l    #1,a0
  7681. .no_minus    moveq    #0,d2
  7682.         moveq    #0,d0
  7683.         cmp.b    #'#',(a0)
  7684.         bne.b    no_dec_num
  7685.  
  7686.         addq.l    #1,a0        ;jmp #
  7687.  
  7688. next_dec    move.b    (a0)+,d0
  7689.         cmp.b    #'0',d0
  7690.         blt.w    end_number
  7691.         cmp.b    #'9',d0
  7692.         bgt.w    end_number
  7693.         sub.b    #'0',d0
  7694.  
  7695.         add.l    d2,d2
  7696.         move.l    d2,d3
  7697.         lsl.l    #2,d2
  7698.         add.l    d3,d2        ;mulu    #10,d2
  7699.  
  7700.         add.l    d0,d2
  7701.         sf    ok_numb
  7702.         bra.b    next_dec
  7703.  
  7704. ;-------------- read binary number ------------------
  7705.  
  7706. no_dec_num    cmp.b    #'%',(a0)
  7707.         bne.b    no_bin_num
  7708.         addq.l    #1,a0
  7709.  
  7710.         moveq    #0,d2
  7711. .loop        move.b    (a0)+,d0
  7712.         sub.b    #'0',d0
  7713.         bmi.w    end_number
  7714.         cmp.b    #1,d0
  7715.         bgt.w    end_number
  7716.         add.l    d2,d2
  7717.         or.b    d0,d2
  7718.         sf    ok_numb
  7719.         bra.b    .loop
  7720.  
  7721. no_bin_num    cmp.b    #"'",(a0)
  7722.         bne.b    no_ascII_num
  7723.         addq.l    #1,a0
  7724.         moveq    #0,d2
  7725. .loop        move.b    (a0)+,d0
  7726.         beq.w    end_number
  7727.         cmp.b    #"'",d0
  7728.         bne.b    .no_end_ascII
  7729.         cmp.b    #"'",(a0)
  7730.         bne.b    end_ascII_num
  7731.         addq.l    #1,a0
  7732. .no_end_ascII    lsl.l    #8,d2
  7733.         move.b    d0,d2
  7734.         bra.b    .loop
  7735.  
  7736. end_ascII_num    addq.l    #1,a0
  7737.         sf    ok_numb
  7738.         bra.w    end_number
  7739.  
  7740. ;-------------- read hexa number + label --------------------
  7741.  
  7742. no_ascII_num    move.l    a0,a1
  7743.         tst.b    label    ;test if label enabled
  7744.         bne.b    .no_label
  7745.         bsr    check_label
  7746.         tst.l    d0
  7747.         beq.b    .no_label
  7748.         sf    ok_numb
  7749.         move.l    a4,-(a7)
  7750.         move.l    d0,a4
  7751.         bsr    reloc_pic
  7752.         move.l    (a4),d2
  7753.         move.l    (a7)+,a4
  7754.         addq.l    #1,a0
  7755.         bra.b    end_number
  7756.  
  7757. .no_label    move.l    a1,a0
  7758.         cmp.b    #'$',(a0)    ;jmp $ for hex number
  7759.         bne.w    next_dec
  7760.         addq.l    #1,a0        ;jmp $
  7761. .ok_dollar    lea.l    hex_list,a1
  7762. next_hex
  7763.         move.b    (a0)+,d0
  7764.         bsr    upper_case
  7765.         moveq    #$f,d1
  7766. seek_hex    cmp.b    (a1,d1.w),d0
  7767.         dbeq    d1,seek_hex
  7768.         tst.w    d1
  7769.         bmi.b    end_number
  7770.         lsl.l    #4,d2
  7771.         or.w    d1,d2
  7772.         sf    ok_numb
  7773.         bra.b    next_hex
  7774.  
  7775. end_number    subq.l    #1,a0
  7776.         move.l    d2,d0
  7777.         tst.b    minus
  7778.         beq.b    .no_minus
  7779.         neg.l    d0
  7780. .no_minus    tst.b    ok_numb        ;test if error
  7781.         movem.l    (a7)+,d1-d3/a1
  7782.         rts
  7783.  
  7784. check_label    movem.l    d1-d3/a1-a4,-(a7)
  7785.         move.l    a0,d3
  7786.         lea.l    label_list,a1
  7787.  
  7788.         moveq    #0,d2
  7789. .main        tst.b    (a1)
  7790.         beq.b    .end_list
  7791.         move.l    a0,a2
  7792.         move.l    a1,a3
  7793.         moveq    #8-1,d1
  7794. .do_cmp        move.b    (a2)+,d0
  7795.         bsr    upper_case
  7796.         cmp.b    (a3)+,d0
  7797.         bne.b    .no_egal
  7798.         tst.b    (a3)
  7799.         dbeq    d1,.do_cmp
  7800.         move.l    8(a1),d2
  7801.         move.l    a2,a4
  7802. .no_egal    lea.l    8+4(a1),a1
  7803.         bra.b    .main
  7804.  
  7805. .end_list    move.l    a4,a0            ;get end of label
  7806.         move.b    (a0),d0
  7807.         beq.b    .ok_label
  7808.         bsr    upper_case
  7809.         lea.l    .symb_list,a1
  7810. .seek        cmp.b    (a1)+,d0
  7811.         beq.b    .ok_label
  7812.         tst.b    (a1)
  7813.         bne.b    .seek
  7814.         moveq    #0,d2
  7815.         move.l    d3,a0
  7816. .ok_label    move.l    d2,d0
  7817.         movem.l    (a7)+,d1-d3/a1-a4
  7818.         rts
  7819.  
  7820. ;list of symbols which can follow a label.
  7821.  
  7822. .symb_list    dc.b $a,' ','+','-','*','/','&','|',')','.',']',0
  7823.         cnop 0,4
  7824.  
  7825. label_list
  7826.         dc.b "D0",0,0,0,0,0,0
  7827.         dc.l registres
  7828.         dc.b "D1",0,0,0,0,0,0
  7829.         dc.l registres+4
  7830.         dc.b "D2",0,0,0,0,0,0
  7831.         dc.l registres+2*4
  7832.         dc.b "D3",0,0,0,0,0,0
  7833.         dc.l registres+3*4
  7834.         dc.b "D4",0,0,0,0,0,0
  7835.         dc.l registres+4*4
  7836.         dc.b "D5",0,0,0,0,0,0
  7837.         dc.l registres+5*4
  7838.         dc.b "D6",0,0,0,0,0,0
  7839.         dc.l registres+6*4
  7840.         dc.b "D7",0,0,0,0,0,0
  7841.         dc.l registres+7*4
  7842.  
  7843.         dc.b "A0",0,0,0,0,0,0
  7844.         dc.l registres+8*4
  7845.         dc.b "A1",0,0,0,0,0,0
  7846.         dc.l registres+9*4
  7847.         dc.b "A2",0,0,0,0,0,0
  7848.         dc.l registres+10*4
  7849.         dc.b "A3",0,0,0,0,0,0
  7850.         dc.l registres+11*4
  7851.         dc.b "A4",0,0,0,0,0,0
  7852.         dc.l registres+12*4
  7853.         dc.b "A5",0,0,0,0,0,0
  7854.         dc.l registres+13*4
  7855.         dc.b "A6",0,0,0,0,0,0
  7856.         dc.l registres+14*4
  7857.         dc.b "A7",0,0,0,0,0,0
  7858.         dc.l registres+15*4
  7859.  
  7860.         dc.b "PC",0,0,0,0,0,0
  7861.         dc.l pc_reg
  7862.         dc.b "VBR",0,0,0,0,0
  7863.         dc.l vbr_reg
  7864.         dc.b "CACR",0,0,0,0
  7865.         dc.l cacr_reg
  7866.         dc.b "CAAR",0,0,0,0
  7867.         dc.l caar_reg
  7868.         dc.b "PCR",0,0,0,0,0
  7869.         dc.l msp_reg
  7870.         dc.b "BUSR",0,0,0,0
  7871.         dc.l caar_reg
  7872.         dc.b "ISP",0,0,0,0,0
  7873.         dc.l isp_reg
  7874.         dc.b "MSP",0,0,0,0,0
  7875.         dc.l msp_reg
  7876.  
  7877.         dc.b "EXEC",0,0,0,0
  7878.         dc.l $4
  7879.         dc.b "LEV3",0,0,0,0
  7880.         dc.l $6c
  7881.  
  7882.         dc.b 0
  7883.  
  7884.         cnop 0,4
  7885.  
  7886. ************************************************************
  7887.  
  7888. read_fact    cmp.b    #'(',(a0)
  7889.         bne.b    .no_parg
  7890.         addq.l    #1,a0
  7891.         bsr.w    read_expr
  7892.         cmp.b    #')',(a0)+
  7893.         bne.w    eval_error
  7894.         bra.b    end_fact
  7895. .no_parg    cmp.b    #'[',(a0)
  7896.         bne.b    .no_cro
  7897.         addq.l    #1,a0
  7898.         bsr.w    read_expr
  7899.         cmp.b    #']',(a0)+
  7900.         bne.w    eval_error
  7901.         move.l    d0,a4
  7902.         bsr    reloc_pic
  7903.         move.l    (a4),d0
  7904.         bra.b    end_fact
  7905. .no_cro        bsr    read_number
  7906.         bne.w    eval_error
  7907.  
  7908. end_fact    cmp.b    #'.',(a0)
  7909.         bne.b    .no_size
  7910.         addq.l    #1,a0            ;jmp .
  7911.         move.l    d1,-(a7)
  7912.         move.b    (a0)+,d1
  7913.         bsr    upper_case1
  7914.         cmp.b    #'B',d1
  7915.         bne.b    .no_b
  7916.         ext.w    d0
  7917.         ext.l    d0
  7918.         clr.w    eval_size
  7919.         bra.b    .end_size
  7920. .no_b        cmp.b    #'W',d1
  7921.         bne.b    .no_w
  7922.         ext.l    d0
  7923.         move.w    #1,eval_size
  7924.         bra.b    .end_size
  7925. .no_w        cmp.b    #'L',d1
  7926.         bne.w    eval_error
  7927.         move.w    #3,eval_size
  7928. .end_size    move.l    (a7)+,d1
  7929. .no_size    rts
  7930.  
  7931.  
  7932. read_terme    move.l    d1,-(a7)
  7933.         bsr.w    read_fact
  7934.         move.l    d0,d1
  7935. .loop        cmp.b    #'*',(a0)
  7936.         bne.b    .no_fois
  7937.         addq.l    #1,a0
  7938.         bsr.w    read_fact
  7939.         bsr.w    muls32
  7940.         bra.b    .loop
  7941. .no_fois    cmp.b    #'/',(a0)
  7942.         bne.b    .no_div
  7943.         addq.l    #1,a0
  7944.         bsr.w    read_fact
  7945.         bsr.w    divs32
  7946.         bra.b    .loop
  7947. .no_div        move.l    d1,d0
  7948.         move.l    (a7)+,d1
  7949.         rts
  7950.  
  7951. read_expr    move.l    d1,-(a7)
  7952.         cmp.b    #'+',(a0)
  7953.         bne.b    .no_p
  7954.         addq.l    #1,a0
  7955. .no_p        cmp.b    #'-',(a0)
  7956.         bne.b    .no_m
  7957.         addq.l    #1,a0
  7958.         bsr.b    read_terme
  7959.         neg.l    d0
  7960.         bra.b    .ok_m
  7961. .no_m        bsr.b    read_terme
  7962. .ok_m        move.l    d0,d1
  7963. .loop        cmp.b    #'+',(a0)
  7964.         bne.b    .no_plus
  7965.         addq.l    #1,a0
  7966.         bsr.b    read_terme
  7967.         add.l    d0,d1
  7968.         bra.b    .loop
  7969. .no_plus    cmp.b    #'-',(a0)
  7970.         bne.b    .no_moins
  7971.         addq.l    #1,a0
  7972.         bsr.b    read_terme
  7973.         sub.l    d0,d1
  7974.         bra.b    .loop
  7975. .no_moins    move.l    d1,d0
  7976.         move.l    (a7)+,d1
  7977.         rts
  7978.  
  7979. ;-> a0 =ptr on expr
  7980. ;<- d0 value
  7981. ;<- flag: zero=ok, negative=error, positive=no number
  7982.  
  7983. evaluate:    move.l    a7,exit_stack
  7984. .loop        cmp.b    #$20,(a0)+
  7985.         beq.b    .loop
  7986.         subq.l    #1,a0
  7987.         tst.b    (a0)
  7988.         beq.b    .no_eval
  7989.         bsr    read_expr
  7990.         tst.b    ok    ;zero = ok
  7991.         rts
  7992. .no_eval    tst.b    ok2
  7993.         rts
  7994. eval_error    move.l    exit_stack,a7
  7995.         moveq    #-1,d0        ;neg val = error
  7996.         rts
  7997.  
  7998. ok        dc.b 0
  7999. ok2        dc.b 1            ;positive val = no number
  8000.  
  8001. ;d0.l,d1.l
  8002. ;d1.l=d0.l*d1.l
  8003. muls32        movem.l    d0/d2/a0,-(a7)
  8004.         lea.l    muls_data,a0
  8005.         movem.l    d0-d1,(a0)
  8006.         swap    d0
  8007.         mulu    d0,d1
  8008.         move.w    d1,d2
  8009.         movem.l    (a0),d0-d1
  8010.         swap    d1
  8011.         mulu    d0,d1
  8012.         add.w    d1,d2
  8013.         swap    d2
  8014.         clr.w    d2
  8015.         movem.l    (a0),d0-d1
  8016.         mulu    d0,d1
  8017.         add.l    d2,d1
  8018.         movem.l    (a7)+,d0/d2/a0
  8019.         rts
  8020.  
  8021.  
  8022. ;d0.l,d1.l
  8023. ;d1.l=d1.l/d0.l
  8024. divs32        movem.l    d0/d2-d4/a0,-(a7)
  8025.         exg    d0,d1
  8026.         sf    d4
  8027.         tst.l    d0
  8028.         bpl.b    .n1
  8029.         neg.l    d0
  8030.         not.b    d4
  8031. .n1        tst.l    d1
  8032.         bpl.b    .n2
  8033.         neg.l    d1
  8034.         not.b    d4
  8035. .n2        move.l    #$ffff,d3
  8036.         lea.l    divs_data,a0
  8037.         movem.l    d0-d1,(a0)
  8038.         moveq    #0,d2
  8039.         cmp.l    #$10000,d1
  8040.         bge.b    .div2
  8041.  
  8042.         tst.w    d1
  8043.         beq.w    eval_error
  8044.  
  8045.         swap    d0
  8046.         and.l    d3,d0
  8047.         divu    d1,d0
  8048.         move.w    d0,d2
  8049.         swap    d2
  8050.         clr.w    d2
  8051.         move.w    2(a0),d0
  8052.         divu    d1,d0
  8053.         and.l    d3,d0
  8054.         add.l    d0,d2
  8055.         bra.b    .ok1
  8056.  
  8057. .div2        lsr.l    #1,d0
  8058.         lsr.l    #1,d1
  8059.         cmp.l    #$10000,d1
  8060.         bge.b    .div2
  8061.         tst.w    d1
  8062.         beq.w    eval_error
  8063.         divu    d1,d0
  8064.         move.w    d0,d2
  8065.         and.l    d3,d2
  8066.  
  8067. .ok1        tst.b    d4
  8068.         beq.b    .n3
  8069.         neg.l    d2
  8070. .n3        move.l    d2,d1
  8071.         movem.l    (a7)+,d0/d2-d4/a0
  8072.         rts
  8073.  
  8074. ************************************************************
  8075. ;-> a0=ptr on ascII registre
  8076. ;<- returns no of registre in d0 and end of ascII reg in a0
  8077.  
  8078. read_reg    movem.l    d1-d3/a1-a4,-(a7)
  8079.         move.l    a0,d3
  8080.         lea.l    reg_table,a1
  8081.  
  8082.         moveq    #-1,d2
  8083. .main        tst.b    (a1)
  8084.         beq.b    .end_list
  8085.         move.l    a0,a2
  8086.         move.l    a1,a3
  8087.         moveq    #4-1,d1
  8088. .do_cmp        move.b    (a2)+,d0
  8089.         bsr    upper_case
  8090.         cmp.b    (a3)+,d0
  8091.         bne.b    .no_egal
  8092.         tst.b    (a3)
  8093.         dbeq    d1,.do_cmp
  8094.         move.w    4(a1),d2
  8095.         move.l    a2,a4
  8096. .no_egal    lea.l    4+2(a1),a1
  8097.         bra.b    .main
  8098.  
  8099. .end_list    move.l    a4,a0            ;get end of register
  8100.         move.w    d2,d0
  8101.         movem.l    (a7)+,d1-d3/a1-a4
  8102.         rts
  8103.  
  8104. reg_table
  8105.         dc.b "D0",0,0
  8106.         dc.w 0
  8107.         dc.b "D1",0,0
  8108.         dc.w 1
  8109.         dc.b "D2",0,0
  8110.         dc.w 2
  8111.         dc.b "D3",0,0
  8112.         dc.w 3
  8113.         dc.b "D4",0,0
  8114.         dc.w 4
  8115.         dc.b "D5",0,0
  8116.         dc.w 5
  8117.         dc.b "D6",0,0
  8118.         dc.w 6
  8119.         dc.b "D7",0,0
  8120.         dc.w 7
  8121.         dc.b "A0",0,0
  8122.         dc.w 8
  8123.         dc.b "A1",0,0
  8124.         dc.w 9
  8125.         dc.b "A2",0,0
  8126.         dc.w 10
  8127.         dc.b "A3",0,0
  8128.         dc.w 11
  8129.         dc.b "A4",0,0
  8130.         dc.w 12
  8131.         dc.b "A5",0,0
  8132.         dc.w 13
  8133.         dc.b "A6",0,0
  8134.         dc.w 14
  8135.         dc.b "A7",0,0
  8136.         dc.w 15
  8137.         dc.b "PC",0,0
  8138.         dc.w 16
  8139.         dc.b "SR",0,0
  8140.         dc.w 17
  8141.         dc.b "VBR",0
  8142.         dc.w 18
  8143.         dc.b "USP",0
  8144.         dc.w 19
  8145.         dc.b "SSP",0
  8146.         dc.w 20
  8147.         dc.b "CACR"
  8148.         dc.w 21
  8149.         dc.b "PCR",0
  8150.         dc.w 22
  8151.         dc.b "BUSR"
  8152.         dc.w 23
  8153.         dc.w 0
  8154.  
  8155.  
  8156. ************************************************************
  8157. ;-------------- Run-length packing -------------------------
  8158.  
  8159. ;-> a0=ptr on source mem to pack
  8160. ;-> a1=destination mem
  8161. ;-> d0.w=size to pack
  8162. ;<- d0.w=packed size
  8163.  
  8164. pack        movem.l    d1-d6/a0-a4,-(a7)
  8165.         move.w    #$100,$dff096        ;disable bitplan DMA
  8166.  
  8167.         move.w    #0,$dff106
  8168.         move.l    a1,a4
  8169.         lea.l    8(a4),a2
  8170.         move.l    d0,4(a4)
  8171.  
  8172.         move.l    a0,a3
  8173.         move.l    d0,d3            ;d3=original size
  8174.  
  8175.         move.l    d0,d5            ;d5=nb of bytes still to pack
  8176.  
  8177. .loop        move.l    d5,d6
  8178.         cmp.l    #128,d6
  8179.         ble.b    .min
  8180.         moveq    #127,d6
  8181.         addq.l    #1,d6            ;d6=128
  8182. .min
  8183.         move.l    d6,d0
  8184.         subq.l    #1,d0            ;d6=1 ?
  8185.         bne.b    .no1
  8186.         move.b    (a0)+,(a2)+
  8187.         sf    (a2)+
  8188.         bra.b    .end
  8189. .no1
  8190.         move.b    (a0)+,d0
  8191.         move.b    d0,$dff180
  8192.         move.b    (a0)+,d1
  8193.         cmp.b    d0,d1
  8194.         bne.b    .diff
  8195.  
  8196.         moveq    #1,d4
  8197.         subq.l    #1,d6
  8198.  
  8199. .cntsame    addq.l    #1,d4
  8200.         subq.l    #1,d6
  8201.         beq.b    .out2
  8202.         cmp.b    (a0)+,d0
  8203.         beq.b    .cntsame
  8204.         subq.l    #1,a0
  8205. .out2
  8206.         sub.l    d4,d5
  8207.         neg.w    d4
  8208.         move.b    d0,(a2)+
  8209.         move.b    d4,(a2)+
  8210.         tst.l    d5
  8211.         beq.b    .end
  8212.         bra.b    .loop
  8213.  
  8214. ;---------------------------------
  8215. .diff        lea.l    -2(a0),a1
  8216.         moveq    #0,d4
  8217. .cntdiff    move.b    d1,d0
  8218.         addq.l    #1,d4
  8219.         subq.l    #1,d6
  8220.         beq.b    .out
  8221.         move.b    (a0)+,d1
  8222.         cmp.b    d0,d1
  8223.         bne.b    .cntdiff
  8224.         subq.l    #1,a0
  8225.  
  8226. .out        subq.l    #1,a0
  8227.         sub.l    d4,d5
  8228.         subq.l    #1,d4
  8229.         move.w    d4,d0
  8230. .copy        move.b    (a1)+,(a2)+
  8231.         dbf    d4,.copy
  8232.         move.b    d0,(a2)+
  8233.         tst.l    d5            ;end of block ?
  8234.         bne.b    .loop
  8235.  
  8236. .end        move.l    a2,d0
  8237.         lea.l    8(a4),a1
  8238.         sub.l    a1,d0            ;d0=packed size
  8239.         move.l    d0,(a4)            ;first long=packed size
  8240.         cmp.l    d0,d3
  8241.         bgt.b    .pack
  8242.         lea.l    8(a4),a1
  8243.         move.l    d3,d0
  8244.         neg.l    d0
  8245.         move.l    d0,(a4)
  8246.         move.l    d3,d0
  8247.         move.b    d3,d1
  8248.         lsr.l    #2,d3
  8249. .copyl        move.l    (a3)+,(a1)+        ;copy unpacked area
  8250.         subq.l    #1,d3
  8251.         bne.b    .copyl
  8252.         and.w    #3,d1
  8253.         bra.b    .godbf
  8254. .copyb        move.b    (a3)+,(a1)+
  8255. .godbf        dbf    d1,.copyb
  8256. .pack
  8257.         addq.l    #8,d0            ;for first long=size
  8258.  
  8259.         move.w    #0,$dff106
  8260.         move.w    #0,$dff180
  8261.         move.w    #$8100,$dff096        ;enable bitplan DMA
  8262.  
  8263.         movem.l    (a7)+,d1-d6/a0-a4
  8264.         rts
  8265.  
  8266. ;----------------------------------------------------------
  8267.  
  8268. ;-> a0=ptr on packed mem
  8269. ;-> a1=ptr on dest mem
  8270.  
  8271. depack        movem.l    d0-d1/a0-a2,-(a7)
  8272.         move.w    #0,$dff106
  8273.         move.w    #$100,$dff096        ;disable bitplan DMA
  8274.  
  8275.         tst.l    (a0)
  8276.         bmi.b    .nopack
  8277.         movem.l    (a0)+,d0-d1
  8278.         move.l    a0,a2
  8279.         add.l    d0,a0
  8280.         add.l    d1,a1
  8281.  
  8282. .loop        cmp.l    a2,a0
  8283.         beq.b    .end
  8284.         moveq    #0,d0
  8285.         move.b    -(a0),d0
  8286.         bmi.b    .neg
  8287. .copy        move.b    -(a0),-(a1)
  8288.         dbf    d0,.copy
  8289.         move.b    (a1),$dff180
  8290.         bra.b    .loop
  8291. .neg        ext.w    d0
  8292.         not.w    d0
  8293.         move.b    -(a0),d1
  8294.         move.b    d1,$dff180
  8295. .fill        move.b    d1,-(a1)
  8296.         dbf    d0,.fill
  8297.         bra.b    .loop
  8298.  
  8299. .nopack        addq.l    #8,a0
  8300.         move.l    4(a0),d0
  8301.         move.b    d0,d1
  8302.         lsr.l    #2,d0
  8303. .copyl        move.l    (a0)+,(a1)+
  8304.         subq.l    #1,d0
  8305.         bne.b    .copyl
  8306.         and.w    #3,d1
  8307.         bra.b    .godbf
  8308. .copyb        move.b    (a0)+,(a1)+
  8309. .godbf        dbf    d1,.copyb
  8310.  
  8311. .end
  8312.         move.w    #0,$dff106
  8313.         move.w    #0,$dff180
  8314.         move.w    #$8100,$dff096        ;enable bitplan DMA
  8315.  
  8316.         movem.l    (a7)+,d0-d1/a0-a2
  8317.         rts
  8318.  
  8319. ************************************************************
  8320.  
  8321. ;a0=ptr on text
  8322.  
  8323. print_curs    bsr    clear_cursor    ;special print which clears cursor
  8324.         clr.w    cursor_x    ;and set it to x=0
  8325.         bsr.b    print
  8326.         bsr    set_cursor
  8327.         rts
  8328.  
  8329.  
  8330. print:        movem.l    d0-d2/a0-a4,-(a7)
  8331.         move.l    output_ptr,d0
  8332.         beq.b    .noout
  8333.         move.l    a0,a1
  8334.         move.l    d0,a2
  8335. .copy        move.b    (a1)+,(a2)+
  8336.         bne.b    .copy
  8337.         subq.l    #1,a2
  8338.         move.l    a2,output_ptr
  8339. ;        move.l    a2,watch2
  8340.  
  8341. .noout        move.w    window_bot,d2
  8342.         lea.l    cursor_x,a3
  8343.         move.w    2(a3),d0
  8344.         cmp.w    window_top,d0
  8345.         bge.b    .ok1
  8346.         move.w    window_top,d0
  8347. .ok1        cmp.w    window_bot,d0
  8348.         blt.b    .ok2
  8349.         move.w    window_bot,d0
  8350. .ok2        move.w    d0,2(a3)
  8351.  
  8352.         move.l    ascII_ptr,a2
  8353.         lea.l    print_cnt,a4
  8354.         clr.w    (a4)
  8355.  
  8356. print_next
  8357. go_print    tst.b    break
  8358.         bne.w    end_print
  8359.         move.w    2(a3),d0
  8360.         mulu    #80,d0
  8361.         lea.l    (a2,d0.l),a1
  8362.         add.w    (a3),a1
  8363.  
  8364.         move.b    (a0)+,d0
  8365.         beq.b    end_printl
  8366.         cmp.b    #$0a,d0
  8367.         beq.b    end_printl
  8368.         cmp.b    #9,d0
  8369.         bne.b    .no_tab
  8370.         move.w    (a3),d0
  8371.         and.w    #$fff8,d0
  8372.         addq.w    #8,d0
  8373.         move.w    d0,(a3)
  8374.         bra.b    go_print
  8375. .no_tab        cmp.b    #$0d,d0
  8376.         bne.b    .no_13
  8377.         clr.w    (a3)
  8378.         bra.b    go_print
  8379.  
  8380. .no_13        move.b    d0,(a1)
  8381.  
  8382.         addq.w    #1,(a3)
  8383.         cmp.w    #80,(a3)
  8384.         blt.b    .ok
  8385.         clr.w    (a3)
  8386.         move.w    2(a3),d0
  8387.         bsr    print_line
  8388.         addq.w    #1,(a4)
  8389.         cmp.w    (a4),d2
  8390.         bgt.b    .okp
  8391.         bsr.b    print_wait
  8392. .okp        cmp.w    2(a3),d2
  8393.         bgt.b    .ok_cr_prt
  8394.         subq.w    #1,2(a3)
  8395.         bsr    scroll_up
  8396. .ok_cr_prt    addq.w    #1,2(a3)
  8397. .ok
  8398.         bra.b    go_print
  8399.  
  8400. end_printl    tst.b    d0
  8401.         beq.b    end_print
  8402. ;-------------- print CR -------------------
  8403.         move.w    2(a3),d0
  8404.         bsr    print_line
  8405.         addq.w    #1,(a4)
  8406.         cmp.w    (a4),d2
  8407.         bgt.b    .okp
  8408.         bsr.b    print_wait
  8409. .okp        clr.w    (a3)
  8410.         cmp.w    2(a3),d2
  8411.         bgt.b    .ok_cr_prt
  8412.         subq.w    #1,2(a3)
  8413.         bsr    scroll_up
  8414. .ok_cr_prt    addq.w    #1,2(a3)
  8415.         tst.b    (a0)
  8416.         beq.b    end_print_out
  8417.         bra.w    print_next
  8418. ;-------------------------------------------
  8419. end_print    move.w    2(a3),d0
  8420.         bsr    print_line
  8421. end_print_out
  8422.         movem.l    (a7)+,d0-d2/a0-a4
  8423.         rts
  8424.  
  8425. print_wait    tst.b    no_print
  8426.         bne.b    .nowait
  8427.         clr.w    (a4)
  8428.         st    new_key
  8429. .wait        move.w    #15,time_cursor
  8430.         tst.b    new_key
  8431.         bne.b    .wait
  8432. .nowait        rts
  8433.  
  8434. ************************************************************
  8435.  
  8436. no_sc_clr    dc.b 0
  8437.         even
  8438.  
  8439. scroll_up    move.l    d2,-(a7)
  8440.         moveq    #1,d2
  8441.         bsr.b    scroll_up2
  8442.         move.l    (a7)+,d2
  8443.         rts
  8444.  
  8445. ;-> d2 = nb of lines
  8446.  
  8447. scroll_up2    movem.l    d0-d1/a0-a1,-(a7)
  8448.         move.l    ascII_ptr,a0
  8449.         move.w    window_top,d0
  8450.         mulu    #80,d0
  8451.         add.l    d0,a0
  8452.         move.w    d2,d0
  8453.         mulu    #80,d0
  8454.         lea.l    (a0,d0.l),a1
  8455.         move.w    window_bot,d0
  8456.         sub.w    window_top,d0
  8457.         sub.w    d2,d0
  8458.         addq.w    #1,d0
  8459.         bra.b    .go_dbf
  8460. .ascII_up    move.l    (a1)+,(a0)+
  8461.         move.l    (a1)+,(a0)+
  8462.         move.l    (a1)+,(a0)+
  8463.         move.l    (a1)+,(a0)+
  8464.         move.l    (a1)+,(a0)+
  8465.         move.l    (a1)+,(a0)+
  8466.         move.l    (a1)+,(a0)+
  8467.         move.l    (a1)+,(a0)+
  8468.         move.l    (a1)+,(a0)+
  8469.         move.l    (a1)+,(a0)+
  8470.         move.l    (a1)+,(a0)+
  8471.         move.l    (a1)+,(a0)+
  8472.         move.l    (a1)+,(a0)+
  8473.         move.l    (a1)+,(a0)+
  8474.         move.l    (a1)+,(a0)+
  8475.         move.l    (a1)+,(a0)+
  8476.         move.l    (a1)+,(a0)+
  8477.         move.l    (a1)+,(a0)+
  8478.         move.l    (a1)+,(a0)+
  8479.         move.l    (a1)+,(a0)+
  8480. .go_dbf        dbf    d0,.ascII_up
  8481.         move.l    #'    ',d0
  8482.         moveq    #5,d1
  8483.         mulu    d2,d1
  8484.         subq.w    #1,d1
  8485. .clear_up    move.l    d0,(a0)+
  8486.         move.l    d0,(a0)+
  8487.         move.l    d0,(a0)+
  8488.         move.l    d0,(a0)+
  8489.         dbf    d1,.clear_up
  8490.  
  8491.         tst.b    no_print
  8492.         bne.w    .noscroll
  8493.  
  8494.         move.l    pic_ptr,a0
  8495.         move.w    window_top,d0
  8496.         mulu    #80*h,d0
  8497.         add.l    d0,a0
  8498.         move.w    d2,d0
  8499.         mulu    #80*h,d0
  8500.         lea.l    (a0,d0.l),a1
  8501.         move.w    window_bot,d0
  8502.         sub.w    window_top,d0
  8503.         sub.w    d2,d0
  8504.         addq.w    #1,d0
  8505.         mulu    #h,d0
  8506.         bra.b    .go_dbf2
  8507. .pixel_up    move.l    (a1)+,(a0)+
  8508.         move.l    (a1)+,(a0)+
  8509.         move.l    (a1)+,(a0)+
  8510.         move.l    (a1)+,(a0)+
  8511.         move.l    (a1)+,(a0)+
  8512.         move.l    (a1)+,(a0)+
  8513.         move.l    (a1)+,(a0)+
  8514.         move.l    (a1)+,(a0)+
  8515.         move.l    (a1)+,(a0)+
  8516.         move.l    (a1)+,(a0)+
  8517.         move.l    (a1)+,(a0)+
  8518.         move.l    (a1)+,(a0)+
  8519.         move.l    (a1)+,(a0)+
  8520.         move.l    (a1)+,(a0)+
  8521.         move.l    (a1)+,(a0)+
  8522.         move.l    (a1)+,(a0)+
  8523.         move.l    (a1)+,(a0)+
  8524.         move.l    (a1)+,(a0)+
  8525.         move.l    (a1)+,(a0)+
  8526.         move.l    (a1)+,(a0)+
  8527. .go_dbf2    dbf    d0,.pixel_up
  8528.  
  8529.         moveq    #0,d0
  8530.         tst.b    no_sc_clr
  8531.         beq.b    .goclr
  8532.         move.w    d2,d1
  8533.         subq.w    #1,d1
  8534.         mulu    #80*h,d1
  8535.         add.l    d1,a0
  8536.         moveq    #5*h-1,d1
  8537.         bra.b    .clear_pix_up
  8538. .goclr        move.w    d2,d1
  8539.         mulu    #5*h,d1
  8540.         subq.w    #1,d1
  8541. .clear_pix_up    move.l    d0,(a0)+
  8542.         move.l    d0,(a0)+
  8543.         move.l    d0,(a0)+
  8544.         move.l    d0,(a0)+
  8545.         dbf    d1,.clear_pix_up
  8546.  
  8547. .noscroll    movem.l    (a7)+,d0-d1/a0-a1
  8548.         rts
  8549.  
  8550. ;-------------------------------------------
  8551.  
  8552. scroll_down    move.l    d2,-(a7)
  8553.         moveq    #1,d2
  8554.         bsr.b    scroll_down2
  8555.         move.l    (a7)+,d2
  8556.         rts
  8557.  
  8558. ;-> d2 = nb of lines
  8559.  
  8560. scroll_down2    movem.l    d0-d1/a0-a1,-(a7)
  8561.  
  8562.         move.l    ascII_ptr,a0
  8563.         move.w    window_bot,d0
  8564.         mulu    #80,d0
  8565.         add.l    d0,a0
  8566.         move.l    a0,a1
  8567.         move.w    d2,d0
  8568.         subq.w    #1,d0
  8569.         mulu    #80,d0
  8570.         sub.l    d0,a1
  8571.         lea.l    80(a0),a0
  8572.         move.w    window_bot,d0
  8573.         sub.w    window_top,d0
  8574.         sub.w    d2,d0
  8575.         addq.w    #1,d0
  8576.         bra.b    .go_dbf
  8577. .ascII_down    move.l    -(a1),-(a0)
  8578.         move.l    -(a1),-(a0)
  8579.         move.l    -(a1),-(a0)
  8580.         move.l    -(a1),-(a0)
  8581.         move.l    -(a1),-(a0)
  8582.         move.l    -(a1),-(a0)
  8583.         move.l    -(a1),-(a0)
  8584.         move.l    -(a1),-(a0)
  8585.         move.l    -(a1),-(a0)
  8586.         move.l    -(a1),-(a0)
  8587.         move.l    -(a1),-(a0)
  8588.         move.l    -(a1),-(a0)
  8589.         move.l    -(a1),-(a0)
  8590.         move.l    -(a1),-(a0)
  8591.         move.l    -(a1),-(a0)
  8592.         move.l    -(a1),-(a0)
  8593.         move.l    -(a1),-(a0)
  8594.         move.l    -(a1),-(a0)
  8595.         move.l    -(a1),-(a0)
  8596.         move.l    -(a1),-(a0)
  8597. .go_dbf        dbf    d0,.ascII_down
  8598.         move.l    #'    ',d0
  8599.         move.w    d2,d1
  8600.         mulu    #5,d1
  8601.         subq.w    #1,d1
  8602. .clear_down    move.l    d0,-(a0)
  8603.         move.l    d0,-(a0)
  8604.         move.l    d0,-(a0)
  8605.         move.l    d0,-(a0)
  8606.         dbf    d1,.clear_down
  8607.  
  8608.         tst.b    no_print
  8609.         bne.w    .noscroll
  8610.  
  8611.         move.l    pic_ptr,a0
  8612.         move.w    window_bot,d0
  8613.         mulu    #80*h,d0
  8614.         add.l    d0,a0
  8615.         move.l    a0,a1
  8616.         move.w    d2,d0
  8617.         subq.w    #1,d0
  8618.         mulu    #80*h,d0
  8619.         sub.l    d0,a1
  8620.         lea.l    80*h(a0),a0
  8621.  
  8622.         move.w    window_bot,d0
  8623.         sub.w    window_top,d0
  8624.         sub.w    d2,d0
  8625.         addq.w    #1,d0
  8626.         mulu    #h,d0
  8627.         bra.b    .go_dbf2
  8628. .pixel_down    move.l    -(a1),-(a0)
  8629.         move.l    -(a1),-(a0)
  8630.         move.l    -(a1),-(a0)
  8631.         move.l    -(a1),-(a0)
  8632.         move.l    -(a1),-(a0)
  8633.         move.l    -(a1),-(a0)
  8634.         move.l    -(a1),-(a0)
  8635.         move.l    -(a1),-(a0)
  8636.         move.l    -(a1),-(a0)
  8637.         move.l    -(a1),-(a0)
  8638.         move.l    -(a1),-(a0)
  8639.         move.l    -(a1),-(a0)
  8640.         move.l    -(a1),-(a0)
  8641.         move.l    -(a1),-(a0)
  8642.         move.l    -(a1),-(a0)
  8643.         move.l    -(a1),-(a0)
  8644.         move.l    -(a1),-(a0)
  8645.         move.l    -(a1),-(a0)
  8646.         move.l    -(a1),-(a0)
  8647.         move.l    -(a1),-(a0)
  8648. .go_dbf2    dbf    d0,.pixel_down
  8649.  
  8650.         moveq    #0,d0
  8651.         tst.b    no_sc_clr
  8652.         beq.b    .goclr
  8653.         move.w    d2,d1
  8654.         subq.w    #1,d1
  8655.         mulu    #80*h,d1
  8656.         sub.l    d1,a0
  8657.         moveq    #5*h-1,d1
  8658.         bra.b    .clear_pix_down
  8659. .goclr        move.w    d2,d1
  8660.         mulu    #5*h,d1
  8661.         subq.w    #1,d1
  8662. .clear_pix_down    move.l    d0,-(a0)
  8663.         move.l    d0,-(a0)
  8664.         move.l    d0,-(a0)
  8665.         move.l    d0,-(a0)
  8666.         dbf    d1,.clear_pix_down
  8667.  
  8668. .noscroll    movem.l    (a7)+,d0-d1/a0-a1
  8669.         rts
  8670.  
  8671. ************************************************************
  8672.  
  8673. ;d0=no of line
  8674.  
  8675. print_line    movem.l    d0-d4/a0-a4,-(a7)
  8676.         tst.b    no_print
  8677.         bne.w    .no_print
  8678.  
  8679.         move.l    ascII_ptr,a0
  8680.         mulu    #80,d0
  8681.         add.l    d0,a0
  8682.         move.l    pic_ptr,a1
  8683.         mulu    #h,d0
  8684.         add.l    d0,a1
  8685.  
  8686.         lea.l    topaz2,a3
  8687.         lea.l    ascII_conv,a4
  8688.         moveq    #80-1,d4
  8689.         moveq    #0,d2
  8690.         moveq    #0,d0
  8691.  
  8692. .do_line_prt    move.b    (a0)+,d2
  8693.  
  8694.         move.b    (a4,d2.w),d0
  8695.         lea.l    (a3,d0.w),a2
  8696.  
  8697.         move.b    110(a2),80(a1)
  8698.         move.b    220(a2),160(a1)
  8699.         move.b    330(a2),240(a1)
  8700.         move.b    440(a2),320(a1)
  8701.         move.b    550(a2),400(a1)
  8702.         move.b    660(a2),480(a1)
  8703.         move.b    770(a2),560(a1)
  8704.         move.b    880(a2),640(a1)
  8705.         move.b    (a2),(a1)+
  8706.  
  8707.         dbf    d4,.do_line_prt
  8708.  
  8709. .stop_print    move.w    #15,time_cursor
  8710.         btst    #10-8,$dff016
  8711.         beq.b    .stop_print
  8712.  
  8713. .no_print    movem.l    (a7)+,d0-d4/a0-a4
  8714.         rts
  8715.  
  8716. ;---------------------------------------------------
  8717.  
  8718. ;d0=x pos
  8719. ;d1=y pos
  8720. ;d2=ascII char
  8721.  
  8722. print_char    movem.l    d0-d2/a1-a2,-(a7)
  8723.         move.l    ascII_ptr,a1
  8724.         add.w    d0,a1
  8725.         lsl.w    #4,d1
  8726.         move.w    d1,a2
  8727.         add.w    d1,d1
  8728.         add.w    d1,d1
  8729.         add.w    a2,d1            ;d1*80
  8730.         move.b    d2,(a1,d1.w)
  8731.  
  8732.         and.w    #$ff,d2
  8733.  
  8734.         lea.l    ascII_conv,a2
  8735.         move.b    (a2,d2.w),d2
  8736.         lea.l    topaz2,a2
  8737.         lea.l    (a2,d2.w),a2
  8738.  
  8739.         move.l    pic_ptr,a1
  8740.         add.w    d0,a1
  8741.         mulu    #h,d1
  8742.         add.l    d1,a1
  8743.         move.b    (a2),(a1)
  8744.         move.b    110(a2),80(a1)
  8745.         move.b    220(a2),160(a1)
  8746.         move.b    330(a2),240(a1)
  8747.         move.b    440(a2),320(a1)
  8748.         move.b    550(a2),400(a1)
  8749.         move.b    660(a2),480(a1)
  8750.         move.b    770(a2),560(a1)
  8751.         move.b    880(a2),640(a1)
  8752.         movem.l    (a7)+,d0-d2/a1-a2
  8753.         rts
  8754.  
  8755.  
  8756. ;d0=x pos
  8757. ;d1=y pos
  8758. ;d2=ascII char
  8759.  
  8760. ;print on all screens
  8761.  
  8762. print_char2    movem.l    d0-d2/a1-a3,-(a7)
  8763.         lsl.w    #4,d1
  8764.         move.w    d1,a2
  8765.         add.w    d1,d1
  8766.         add.w    d1,d1
  8767.         add.w    a2,d1            ;d1*80
  8768.         add.w    d0,d1
  8769.         lea.l    ascII_ptr+4,a1
  8770. .loop        tst.l    (a1)
  8771.         beq.b    .end_ascII
  8772.         move.l    (a1)+,a3
  8773.         move.b    d2,(a3,d1.w)
  8774.         bra.b    .loop
  8775.  
  8776. .end_ascII    and.w    #$ff,d2
  8777.  
  8778.         lea.l    ascII_conv,a2
  8779.         move.b    (a2,d2.w),d2
  8780.         lea.l    topaz2,a2
  8781.         lea.l    (a2,d2.w),a2
  8782.  
  8783.         sub.w    d0,d1
  8784.  
  8785.         move.l    pic_ptr,a1
  8786.         add.w    d0,a1
  8787.         mulu    #h,d1
  8788.         add.l    d1,a1
  8789.         move.b    (a2),(a1)
  8790.         move.b    110(a2),80(a1)
  8791.         move.b    220(a2),160(a1)
  8792.         move.b    330(a2),240(a1)
  8793.         move.b    440(a2),320(a1)
  8794.         move.b    550(a2),400(a1)
  8795.         move.b    660(a2),480(a1)
  8796.         move.b    770(a2),560(a1)
  8797.         move.b    880(a2),640(a1)
  8798.         movem.l    (a7)+,d0-d2/a1-a3
  8799.         rts
  8800.  
  8801. do_cursor:    bsr    clear_snap
  8802.         tst.b    no_curs
  8803.         bne.w    .no_cur
  8804.  
  8805.         movem.l    d0-a6,-(a7)
  8806.         lea.l    $dff000,a6
  8807.         bsr    init_mouse
  8808.         move.w    x_spr,d0
  8809.         bpl.b    .ok1
  8810.         clr.w    d0
  8811. .ok1        cmp.w    #640,d0
  8812.         blt.b    .ok2
  8813.         move.w    #639,d0
  8814. .ok2        move.w    d0,x_spr
  8815.         lsr    #3,d0
  8816.         move.w    d0,snap_x
  8817.         move.w    y_spr,d0
  8818.         bpl.b    .ok3
  8819.         clr.w    d0
  8820. .ok3        move.w    screen_height,d1
  8821.         mulu    #9,d1
  8822.         cmp.w    d1,d0
  8823.         blt.b    .ok4
  8824.         move.w    d1,d0
  8825.         subq.w    #1,d0
  8826. .ok4        move.w    d0,y_spr
  8827.         ext.l    d0
  8828.         divu    #9,d0
  8829.         move.w    d0,snap_y
  8830.         bsr    set_snap
  8831.  
  8832.         tst.b    nosnap
  8833.         bne.w    .nos
  8834.         tst.b    left
  8835.         beq.w    .noleft
  8836.         move.l    ascII_ptr,a0
  8837.         move.w    snap_y,d0
  8838.         mulu    #80,d0
  8839.         add.l    d0,a0
  8840.         move.w    snap_x,d0
  8841.         cmp.b    #$20,(a0,d0.w)
  8842.         beq.b    .noleft
  8843. .redeb        tst.w    d0
  8844.         beq.b    .debs
  8845.         cmp.b    #$20,-1(a0,d0.w)
  8846.         beq.b    .debs
  8847.         cmp.b    #';',-1(a0,d0.w)
  8848.         beq.b    .debs
  8849.         cmp.b    #'=',-1(a0,d0.w)
  8850.         beq.b    .debs
  8851.         cmp.b    #'(',-1(a0,d0.w)
  8852.         beq.b    .debs
  8853.         cmp.b    #',',-1(a0,d0.w)
  8854.         beq.b    .debs
  8855.         subq.w    #1,d0
  8856.         bra.b    .redeb
  8857. .debs
  8858.         lea.l    snap_buf,a1
  8859. .cops        move.b    (a0,d0.w),(a1)+
  8860.         addq.w    #1,d0
  8861.         cmp.w    #80,d0
  8862.         beq.b    .ends
  8863.         cmp.b    #',',(a0,d0.w)
  8864.         beq.b    .ends
  8865.         cmp.b    #';',(a0,d0.w)
  8866.         beq.b    .ends
  8867.         cmp.b    #')',(a0,d0.w)
  8868.         beq.b    .ends
  8869.         cmp.b    #$20,(a0,d0.w)
  8870.         bne.b    .cops
  8871. .ends        sf    (a1)
  8872.  
  8873. .noleft
  8874. .nos
  8875.         movem.l    (a7)+,d0-a6
  8876.  
  8877.         subq.w    #1,time_cursor
  8878.         bpl.b    no_cursor
  8879.         sf    nosnap
  8880.         move.w    #15,time_cursor
  8881.         bsr.b    set_cursor
  8882. .no_cur        rts
  8883.  
  8884. set_cursor:    movem.l    d0/a0,-(a7)
  8885.         move.l    pic_ptr,a0
  8886.         add.w    cursor_x,a0
  8887.         move.w    cursor_y,d0
  8888.         mulu    #80*h,d0
  8889.         add.l    d0,a0
  8890.         not.b    cursor_on
  8891.         tst.b    no_print
  8892.         bne.b    .no
  8893.         not.b    (a0)
  8894.         not.b    80(a0)
  8895.         not.b    160(a0)
  8896.         not.b    240(a0)
  8897.         not.b    320(a0)
  8898.         not.b    400(a0)
  8899.         not.b    480(a0)
  8900.         not.b    560(a0)
  8901. .no        movem.l    (a7)+,d0/a0
  8902. no_cursor    rts
  8903.  
  8904. clear_cursor:    movem.l    d0/a0,-(a7)
  8905.         st    nosnap
  8906.         bsr    clear_snap
  8907.  
  8908.         move.w    #15,time_cursor
  8909.         move.l    pic_ptr,a0
  8910.         add.w    cursor_x,a0
  8911.         move.w    cursor_y,d0
  8912.         mulu    #80*h,d0
  8913.         add.l    d0,a0
  8914.         tst.b    cursor_on
  8915.         beq.b    no_clear_curs
  8916.         tst.b    no_print
  8917.         bne.b    .no
  8918.         not.b    (a0)
  8919.         not.b    80(a0)
  8920.         not.b    160(a0)
  8921.         not.b    240(a0)
  8922.         not.b    320(a0)
  8923.         not.b    400(a0)
  8924.         not.b    480(a0)
  8925.         not.b    560(a0)
  8926. .no
  8927. no_clear_curs    sf    cursor_on
  8928.         movem.l    (a7)+,d0/a0
  8929.         rts
  8930.  
  8931. snap_x:        dc.w 40
  8932. snap_y:        dc.w 10
  8933. snap_buf:    dcb.b 84,0
  8934. snap:        dc.b 0
  8935. nosnap:        dc.b 0
  8936.         even
  8937.  
  8938. clear_snap:    movem.l    d0-d2/a0,-(a7)
  8939.         move.w    sr,d2
  8940.         move.w    #$2700,sr
  8941.         tst.b    snap
  8942.         beq.b    .snapoff
  8943.         sf    snap
  8944.         move.l    pic_ptr,a0
  8945.         add.w    snap_x,a0
  8946.         move.w    snap_y,d0
  8947.         mulu    #80*h,d0
  8948.         add.l    d0,a0
  8949.         move.b    #$55,d0
  8950.         move.b    #$aa,d1
  8951.         eor.b    d0,(a0)
  8952.         eor.b    d1,80(a0)
  8953.         eor.b    d0,160(a0)
  8954.         eor.b    d1,240(a0)
  8955.         eor.b    d0,320(a0)
  8956.         eor.b    d1,400(a0)
  8957.         eor.b    d0,480(a0)
  8958.         eor.b    d1,560(a0)
  8959. .snapoff    move.w    d2,sr
  8960.         movem.l    (a7)+,d0-d2/a0
  8961.         rts
  8962.  
  8963. set_snap:    movem.l    d0-d2/a0,-(a7)
  8964.         tst.b    nosnap
  8965.         bne.b    .nosnap
  8966.         move.w    sr,d2
  8967.         move.w    #$2700,sr
  8968.         tst.b    snap
  8969.         bne.b    .snapon
  8970.         st    snap
  8971.         move.l    pic_ptr,a0
  8972.         add.w    snap_x,a0
  8973.         move.w    snap_y,d0
  8974.         mulu    #80*h,d0
  8975.         add.l    d0,a0
  8976.         move.b    #$55,d0
  8977.         move.b    #$aa,d1
  8978.         eor.b    d0,(a0)
  8979.         eor.b    d1,80(a0)
  8980.         eor.b    d0,160(a0)
  8981.         eor.b    d1,240(a0)
  8982.         eor.b    d0,320(a0)
  8983.         eor.b    d1,400(a0)
  8984.         eor.b    d0,480(a0)
  8985.         eor.b    d1,560(a0)
  8986. .snapon        move.w    d2,sr
  8987. .nosnap        movem.l    (a7)+,d0-d2/a0
  8988.         rts
  8989.  
  8990. ;-------------- Print an hex number -------------------
  8991.  
  8992. ;-> d0=hex number
  8993. ;-> d1=nb ascIIs (length of hex number)
  8994.  
  8995. print_hex    move.l    a0,-(a7)
  8996.         lea.l    general_txt,a0
  8997.         bsr.w    conv_hex
  8998.         sf    (a0,d1.w)        ;set end CHAR
  8999.         bsr    print
  9000.         move.l    (a7)+,a0
  9001.         rts
  9002.  
  9003. ;-------------- Print an hex number followed by a CR -
  9004.  
  9005. ;-> d0=hex number
  9006. ;-> d1=nb ascIIs (length of hex number)
  9007.  
  9008. print_hexCR    move.l    a0,-(a7)
  9009.         lea.l    general_txt,a0
  9010.         bsr.b    conv_hex
  9011.         move.b    #$a,(a0,d1.w)        ;set CR CHAR
  9012.         sf    1(a0,d1.w)        ;set end CHAR
  9013.         bsr    print
  9014.         move.l    (a7)+,a0
  9015.         rts
  9016.  
  9017. ;-------------- Print a decimal number --------------------
  9018.  
  9019. ;-> d0=dec number
  9020. ;-> d1=nb ascIIs    ;bit7=show zero
  9021.  
  9022. print_dec    movem.l    d0/a0,-(a7)
  9023.         lea.l    general_txt,a0
  9024.         bsr.b    conv_dec
  9025.         lea.l    general_txt,a0
  9026.         and.w    #$7f,d1
  9027.         sf    1(a0,d1.w)        ;set end CHAR
  9028.         bsr    print
  9029.         movem.l    (a7)+,d1/a0
  9030.         rts
  9031.  
  9032. ;-------------- Print a decimal number followed by a CR ---
  9033.  
  9034. ;-> d0=dec number
  9035. ;-> d1=nb ascIIs    ;bit7=show zero
  9036.  
  9037. print_decCR    movem.l    d0/a0,-(a7)
  9038.         lea.l    general_txt,a0
  9039.         bsr.b    conv_dec
  9040.         lea.l    general_txt,a0
  9041.         and.w    #$7f,d1
  9042.         move.b    #$a,1(a0,d1.w)        ;set CR CHAR
  9043.         sf    2(a0,d1.w)        ;set end CHAR
  9044.         bsr    print
  9045.         movem.l    (a7)+,d1/a0
  9046.         rts
  9047.  
  9048. ;-------------- Convert hex to ascII ------------------
  9049. ;-> d0=hex number
  9050. ;-> d1=nb ascIIs (length of hex number)
  9051. ;-> a0=ptr on ascII destination buffer
  9052.  
  9053. conv_hex    movem.l    d0-d2/a1,-(a7)
  9054.         and.w    #$007f,d1        ;clear bit 7
  9055.         lea.l    hex_list,a1
  9056.         subq.w    #1,d1
  9057. .do_conv_hex    move.w    d0,d2
  9058.         and.w    #$f,d2
  9059.         move.b    (a1,d2.w),(a0,d1.w)
  9060.         lsr.l    #4,d0
  9061.         dbf    d1,.do_conv_hex
  9062.         movem.l    (a7)+,d0-d2/a1
  9063.         rts
  9064.  
  9065. ;-------------- Convert dec to ascII ------------------
  9066. ;d0=dec number
  9067. ;d1=nb ascIIs        bit7=show zero
  9068. ;a0=ptr on ascII buffer
  9069.  
  9070. conv_dec:    movem.l    d0-d4/a1,-(a7)
  9071.  
  9072.         btst    #7,d1
  9073.         sne    d3
  9074.         and.w    #$003f,d1
  9075.  
  9076.         lea.l    dec_list,a1
  9077.         neg.w    d1
  9078.         add.w    #10,d1
  9079.         lsl.w    #2,d1
  9080.         add.w    d1,a1
  9081.  
  9082.         move.b    #' ',d4
  9083.         tst.l    d0
  9084.         bpl.b    .no_minus
  9085.         neg.l    d0
  9086.         move.b    #'-',d4
  9087.  
  9088. .no_minus    move.b    #' ',(a0)+
  9089.         move.l    d0,d2
  9090. .next        moveq    #0,d0
  9091.         move.l    (a1)+,d1
  9092.         beq.b    .end_dec
  9093. .loop        cmp.l    d2,d1
  9094.         bgt.b    .ok_dix
  9095.         sub.l    d1,d2
  9096.         addq.l    #1,d0
  9097.         bra.b    .loop
  9098. .ok_dix        subq.l    #1,d1
  9099.         bne.b    .no_last
  9100.         tst.b    d3
  9101.         bne.b    .no_last
  9102.         st    d3
  9103.         move.b    d4,-1(a0)
  9104. .no_last    tst.b    d3
  9105.         bne.b    .no_first
  9106.         st    d3
  9107.         tst.b    d0
  9108.         beq.b    .empty
  9109.         move.b    d4,-1(a0)
  9110.         bra.b    .no_first
  9111. .empty        sf    d3
  9112.         move.b    #' ',d0
  9113.         bra.b    .ok_spc
  9114. .no_first    cmp.b    #9,d0
  9115.         bls.b    .ok_dec
  9116.         moveq    #0,d0
  9117. .ok_dec        add.b    #'0',d0
  9118. .ok_spc        move.b    d0,(a0)+
  9119.         bra.b    .next
  9120.  
  9121. .end_dec    movem.l    (a7)+,d0-d4/a1
  9122.         rts
  9123.  
  9124.         cnop 0,4
  9125. dec_list    dc.l 1000000000
  9126.         dc.l 100000000
  9127.         dc.l 10000000
  9128.         dc.l 1000000
  9129.         dc.l 100000
  9130.         dc.l 10000
  9131.         dc.l 1000
  9132.         dc.l 100
  9133.         dc.l 10
  9134.         dc.l 1
  9135.         dc.l 0
  9136.  
  9137. **********************************************************
  9138.  
  9139. init_ascII    movem.l    d0-d2/a1-a3,-(a7)
  9140.         lea.l    ascII_conv,a1
  9141.  
  9142.         move.w    #256-1,d0
  9143.         moveq    #0,d1
  9144.  
  9145. loop_ia        lea.l    ascII,a2
  9146.         move.w    #end_ascII-ascII-1,d2
  9147. seek_ascII_i    cmp.b    (a2)+,d1
  9148.         dbeq    d2,seek_ascII_i
  9149.  
  9150.         lea.l    ascII+1,a3
  9151.         sub.l    a3,a2
  9152.         move.w    a2,d2
  9153.         move.b    d2,(a1)+
  9154.         addq.w    #1,d1
  9155.         dbf    d0,loop_ia
  9156.  
  9157.         movem.l    (a7)+,d0-d2/a1-a3
  9158.         rts
  9159.  
  9160. **************************************************************************
  9161.  
  9162. ;save DMA disk buffer to backup_dma
  9163. ;-> a0=buffer chip address
  9164.  
  9165. save_buffer    movem.l    d0-d1/a0-a1,-(a7)
  9166.         move.l    a0,buffer
  9167.         lea.l    backup_dma,a1
  9168.         move.w    #($1a00*2)/4-1,d1
  9169. .exg        move.l    (a0)+,(a1)+
  9170.         dbf    d1,.exg
  9171.         movem.l    (a7)+,d0-d1/a0-a1
  9172.         rts
  9173.  
  9174. rest_buffer    movem.l    d0-d1/a0-a1,-(a7)
  9175.         move.l    buffer,a1
  9176.         lea.l    backup_dma,a0
  9177.         move.w    #($1a00*2)/4-1,d1
  9178. .exg        move.l    (a0)+,(a1)+
  9179.         dbf    d1,.exg
  9180.         movem.l    (a7)+,d0-d1/a0-a1
  9181.         rts
  9182.  
  9183. ***********************************************************
  9184.  
  9185. ;-------------- read a single sector from floppy disk -----
  9186.  
  9187. ;-> d0=no of sector to read
  9188. ;-> a0=address to copy sector into
  9189.  
  9190. read_fsector    movem.l    d0-d7/a0-a4,-(a7)
  9191.  
  9192.         move.l    a0,a3
  9193.  
  9194.         moveq    #0,d2
  9195.         move.w    d0,d2
  9196.         divu    #11,d2            ;d2=track_no of sector to read
  9197.         cmp.w    track_buffer_no,d2    ;is track_buffer ok ?
  9198.         bne.b    .notsame
  9199.  
  9200. .okaccess    lea.l    track_sector,a0
  9201.         move.l    d2,d0
  9202.         swap    d0
  9203.         tst.b    (a0,d0.w)        ;sector is in buffer ?
  9204.         bne.b    .notsame
  9205.  
  9206.         mulu    #512,d0            ;offset in track_buffer
  9207.         lea.l    track_buffer,a0
  9208.  
  9209.         add.l    d0,a0
  9210.         moveq    #512/8-1,d0
  9211. .copysector    move.l    (a0)+,(a3)+
  9212.         move.l    (a0)+,(a3)+
  9213.         dbf    d0,.copysector
  9214.         bra.b    .okread
  9215.  
  9216. .notsame    bsr    write_flush
  9217.         move.w    d2,track_buffer_no
  9218.         move.w    d2,d0
  9219.         mulu    #11,d0
  9220.         lea.l    track_sector,a0
  9221.         clr.l    (a0)+            ;all sectors
  9222.         clr.l    (a0)+            ;are
  9223.         clr.l    (a0)+            ;loaded
  9224.         lea.l    track_buffer,a0
  9225.         moveq    #11,d1            ;read 11 sectors (one track)
  9226.         moveq    #0,d7            ;read command
  9227.         bsr    access            ;read the track in track_buffer
  9228.         beq.b    .okaccess        ;no error ?
  9229.  
  9230.         moveq    #-1,d0
  9231.         move.w    d0,track_buffer_no    ;an error occured
  9232.         lea.l    track_sector,a0
  9233.         move.l    d0,(a0)+        ;all sectors
  9234.         move.l    d0,(a0)+        ;are
  9235.         move.l    d0,(a0)+        ;NOT loaded
  9236.  
  9237. .okread        tst.w    drive_err
  9238.         movem.l    (a7)+,d0-d7/a0-a4
  9239.         rts
  9240.  
  9241. ;-------------- write a single sector to floppy disk ------
  9242.  
  9243. ;-> d0=no of sector to write
  9244. ;-> a0=address to copy sector from
  9245.  
  9246. write_fsector    movem.l    d0-d7/a0-a4,-(a7)
  9247.  
  9248.         move.l    a0,a3
  9249.  
  9250.         moveq    #0,d2
  9251.         move.w    d0,d2
  9252.         divu    #11,d2            ;d2=track_no of sector to write
  9253.         cmp.w    track_buffer_no,d2    ;is track_buffer ok ?
  9254.         beq.b    .oksame
  9255.  
  9256. .notsame    bsr.b    write_flush
  9257.         move.w    d2,track_buffer_no
  9258.         moveq    #-1,d0
  9259.         lea.l    track_sector,a0
  9260.         move.l    d0,(a0)+        ;all sectors
  9261.         move.l    d0,(a0)+        ;are
  9262.         move.l    d0,(a0)+        ;NOT loaded
  9263.  
  9264. .oksame        move.l    d2,d0
  9265.         swap    d0
  9266.         lea.l    track_sector,a0
  9267.         sf    (a0,d0.w)        ;set sector as loaded in buffer
  9268.         mulu    #512,d0
  9269.         lea.l    track_buffer,a0
  9270.         add.l    d0,a0
  9271.         moveq    #512/8-1,d0
  9272. .copysector    move.l    (a3)+,(a0)+
  9273.         move.l    (a3)+,(a0)+
  9274.         dbf    d0,.copysector
  9275.  
  9276.         st    flush_needed
  9277.  
  9278.         tst.w    drive_err
  9279.         movem.l    (a7)+,d0-d7/a0-a4
  9280.         rts
  9281.  
  9282. ;-------------- flush write buffer for floppy disk --------
  9283.  
  9284. write_flush    movem.l    d0-d7/a0-a4,-(a7)
  9285.  
  9286.         tst.w    track_buffer_no
  9287.         bmi.w    .noflush
  9288.  
  9289.         tst.b    flush_needed
  9290.         beq.w    .noflush
  9291.  
  9292. .recheck    lea.l    track_sector,a0
  9293.         lea.l    11(a0),a1        ;end of sectors list
  9294.         moveq    #-1,d2
  9295.         moveq    #11-1,d0
  9296. .seek        addq.l    #1,d2
  9297.         tst.b    (a0)+
  9298.         dbne    d0,.seek
  9299.         beq.b    .goflush
  9300.  
  9301.         moveq    #0,d1            ;d1=nb sectors to read
  9302.         subq.l    #1,a0
  9303. .link        sf    (a0)+            ;set sector as loaded
  9304.         addq.l    #1,d1
  9305.         cmp.l    a1,a0
  9306.         beq.b    .okread
  9307.         tst.b    (a0)
  9308.         bne.b    .link
  9309.  
  9310. .okread        cmp.w    #11,d1
  9311.         beq.b    .noflush
  9312.         lea.l    track_buffer,a0
  9313.         move.w    track_buffer_no,d0
  9314.         mulu    #11,d0
  9315.         add.w    d2,d0
  9316.         mulu    #512,d2
  9317.         add.l    d2,a0
  9318.         moveq    #0,d7            ;read command
  9319.         bsr    access
  9320.         bne.b    .error
  9321.         bra.b    .recheck
  9322.  
  9323. .goflush    move.w    track_buffer_no,d0
  9324.         mulu    #11,d0
  9325.         lea.l    track_buffer,a0
  9326.         moveq    #11,d1            ;write 11 sectors (one track)
  9327.         moveq    #-1,d7            ;write command
  9328.         bsr    access
  9329.         beq.b    .noerr
  9330.  
  9331. .error        moveq    #-1,d0
  9332.         move.w    d0,track_buffer_no    ;an error occured
  9333.         lea.l    track_sector,a0
  9334.         move.l    d0,(a0)+        ;all sectors
  9335.         move.l    d0,(a0)+        ;are
  9336.         move.l    d0,(a0)+        ;NOT loaded
  9337.  
  9338. .noerr
  9339. .noflush    sf    flush_needed
  9340.  
  9341.         tst.w    drive_err
  9342.         movem.l    (a7)+,d0-d7/a0-a4
  9343.         rts
  9344.  
  9345. ;-------------- write multiple sectors to floppy ----------
  9346. ;-------------- exg pic memory and stop interrupts --------
  9347. ;-> d0=first sector
  9348. ;-> d1=nb of sector
  9349. ;-> a0=address
  9350.  
  9351. write        movem.l    d0-d1/a0,-(a7)
  9352.         tst.w    d1
  9353.         beq.b    .nosave
  9354.         bsr    remove_pic
  9355. .loop        bsr    write_fsector
  9356.         addq.w    #1,d0
  9357.         lea.l    512(a0),a0
  9358.         subq.w    #1,d1
  9359.         bne.b    .loop
  9360.         bsr    write_flush
  9361.         bsr    set_pic
  9362. .nosave        tst.w    drive_err
  9363.         movem.l    (a7)+,d0-d1/a0
  9364.         rts
  9365.  
  9366. ;-------------- read multiple sectors from floppy ---------
  9367. ;-------------- exg pic memory and restore interrupts -----
  9368.  
  9369. ;-> d0=first sector
  9370. ;-> d1=nb of sector
  9371. ;-> a0=address
  9372.  
  9373. read        movem.l    d0-d1/a0,-(a7)
  9374.         tst.w    d1
  9375.         beq.b    .noread
  9376.         bsr    remove_pic
  9377. .loop        bsr    read_fsector
  9378.         addq.w    #1,d0
  9379.         lea.l    512(a0),a0
  9380.         subq.w    #1,d1
  9381.         bne.b    .loop
  9382.         bsr    set_pic
  9383. .noread        tst.w    drive_err
  9384.         movem.l    (a7)+,d0-d1/a0
  9385.         rts
  9386.  
  9387. ;-------------- write multiple sectors to floppy ----------
  9388.  
  9389. ;-> d0=first sector
  9390. ;-> d1=nb of sector
  9391. ;-> a0=address
  9392.  
  9393. write2        movem.l    d0-d1/a0,-(a7)
  9394.         tst.w    d1
  9395.         beq.b    .nosave
  9396. .loop        bsr    write_fsector
  9397.         addq.w    #1,d0
  9398.         lea.l    512(a0),a0
  9399.         subq.w    #1,d1
  9400.         bne.b    .loop
  9401.         bsr    write_flush
  9402. .nosave        tst.w    drive_err
  9403.         movem.l    (a7)+,d0-d1/a0
  9404.         rts
  9405.  
  9406. ;-------------- read multiple sectors from floppy ---------
  9407.  
  9408. ;-> d0=first sector
  9409. ;-> d1=nb of sector
  9410. ;-> a0=address
  9411.  
  9412. read2        movem.l    d0-d1/a0,-(a7)
  9413.         tst.w    d1
  9414.         beq.b    .noread
  9415. .loop        bsr    read_fsector
  9416.         addq.w    #1,d0
  9417.         lea.l    512(a0),a0
  9418.         subq.w    #1,d1
  9419.         bne.b    .loop
  9420. .noread        tst.w    drive_err
  9421.         movem.l    (a7)+,d0-d1/a0
  9422.         rts
  9423.  
  9424. ***********************************************
  9425. ;d0.w=start sector (if write then d0 MUST be a multiple of 11)
  9426. ;d1.w=nb sectors   (if write then d1 MUST be a multiple of 11)
  9427. ;d7: -1=write 0=read
  9428. ;a0=address to load/save
  9429.  
  9430. ;if d1=-1 & d7=-1 -> format whole disk
  9431.  
  9432. access:        movem.l    d0-a6,-(a7)
  9433.         lea.l    $dff000,a6
  9434.         st    floppy_op
  9435.  
  9436.         ext.l    d0
  9437.         ext.l    d1
  9438.  
  9439.         move.l    a0,a4            ;a4=address of actual sector
  9440.  
  9441.         lea.l    $40000,a0
  9442.         bsr    save_buffer
  9443.  
  9444.         sf    first_sauve
  9445.         tst.w    d1
  9446.         smi    format
  9447.         bpl.b    .no_format
  9448.         moveq    #0,d0
  9449.         move.w    #22*80,d1
  9450.         lea.l    track_sector,a0
  9451.         moveq    #-1,d5
  9452.         move.l    d5,(a0)+        ;all sectors
  9453.         move.l    d5,(a0)+        ;are NOT
  9454.         move.l    d5,(a0)+        ;loaded in track_buffer
  9455.         move.w    d5,track_buffer_no
  9456. .no_format
  9457.  
  9458.         move.w    d1,sectpos        ;nb sectors to read/write
  9459.  
  9460.         cmp.l    #-1,d7            ;write requested ?
  9461.         seq    writes
  9462.  
  9463.         ext.l    d0
  9464.         move.l    d0,d5
  9465.         divu    #11,d5            ;d5.w = start_track
  9466.         move.l    d5,d0
  9467.         swap    d0
  9468.         move.w    d0,startsec    ;nb sectors to skip in 1st track
  9469.  
  9470.         lea.l    $bfd100,a0
  9471.         move.w    #$8210,$96(a6)
  9472.  
  9473.         move.w    $10(a6),d0
  9474.         or.w    #$8000,d0
  9475.         move.w    d0,OldAdk
  9476.         move.w    #$7fff,$9e(a6)
  9477.         move.w    #$9100,$9e(a6)
  9478.         tst.b    writes
  9479.         bne.b    no_sync
  9480.         move.w    #$8400,$9e(a6)
  9481. no_sync:    move.w    #$4489,$7e(a6)
  9482.  
  9483.         bsr    motor_on        ;turn drive motor ON
  9484.         tst.w    drive_err
  9485.         bne.w    fin
  9486.         tst.b    writes
  9487.         beq.b    .read
  9488.         btst    #3,$bfe001        ;test if write protected
  9489.         bne.b    .read
  9490.         move.w    #WRITEPROTECT_ERR,drive_err
  9491.         bra.w    fin
  9492. .read
  9493.         bsr    inittete    ;init head pos (track 0) if needed
  9494.  
  9495.         move.w    drive,d0
  9496.         bclr    d0,(a0)
  9497.  
  9498.         move.w    d5,d0
  9499.         bsr    settete            ;move heads to 1st track
  9500.  
  9501.         sf    ctrl            ;clear end signal
  9502.  
  9503. next:        movem.l    d0-d1/a0/a3,-(a7)    ;check if there is a conflict
  9504.         move.l    buffer,d0        ;between the DMA buffer and
  9505.         move.l    d0,d1            ;the actual sector accessed
  9506.         add.l    #$1a00*2,d1
  9507.         lea.l    11*512(a4),a3
  9508.         cmp.l    d0,a3
  9509.         ble.b    .okbuf
  9510.         cmp.l    d1,a4
  9511.         bge.b    .okbuf
  9512.         bsr    rest_buffer
  9513.         move.l    #$50000,d1
  9514.         cmp.l    #$40000,d0
  9515.         beq.b    .go40
  9516.         move.l    #$40000,d1
  9517. .go40        move.l    d1,a0
  9518.         bsr    save_buffer
  9519. .okbuf        movem.l    (a7)+,d0-d1/a0/a3
  9520.  
  9521.         tst.b    writes
  9522.         beq.b    ok_read
  9523.         tst.w    startsec        ;if write then 1st sector
  9524.         bne.b    fin            ;must be a multiple of 11
  9525.         cmp.w    #11,sectpos        ;write at least 11 sectors
  9526.         blt.b    fin
  9527.         bsr    sauve
  9528.         bra.b    ok_sauve
  9529. ok_read:    bsr    charge
  9530.         tst.w    drive_err
  9531.         bne.b    fin
  9532. ok_sauve:    tst.b    ctrl            ;end of access ?
  9533.         bne.b    fin
  9534.         tst.b    break
  9535.         bne.b    fin
  9536.  
  9537.     ;    btst    #5,$bfe001        ;removed due to AT 1200 bug !
  9538.     ;    beq.b    .okspeed
  9539.     ;    move.w    #NODISK_ERR,drive_err
  9540.     ;    bra.b    fin
  9541.  
  9542. .okspeed    movem.l    d0/a1,-(a7)
  9543.         lea.l    track,a1
  9544.         move.w    drive,d0
  9545.         add.w    d0,d0
  9546.         move.w    -3*2(a1,d0.w),d0    ;get previous track pos
  9547.         addq.w    #1,d0            ;step to next track or side
  9548.         bsr    settete
  9549.         movem.l    (a7)+,d0/a1
  9550.         bra.w    next
  9551.  
  9552. fin:        bsr    timer2
  9553.         bsr    rest_buffer
  9554.  
  9555.         move.w    drive,d0
  9556.         bset    d0,(a0)            ;deselect drive
  9557.         bsr    timer1
  9558.  
  9559.         move.w    #$7fff,$9e(a6)
  9560.         move.w    OldAdk,$9e(a6)
  9561.  
  9562.         tst.w    drive_err
  9563.         movem.l    (a7)+,d0-a6
  9564.         rts
  9565.  
  9566. *******************************
  9567.  
  9568. motor_on:    movem.l    d0/a0,-(a7)
  9569.         lea.l    $bfd100,a0
  9570.         move.w    drive,d0
  9571.         or.b    #$80,(a0)
  9572.         bset    d0,(a0)
  9573.         bsr    timer1
  9574.         and.b    #$7f,(a0)
  9575.         bsr    timer1
  9576.         bclr    d0,(a0)
  9577.         bsr    timer1
  9578.  
  9579.         btst    d0,mot_on
  9580.         bne.b    .already_on
  9581.  
  9582.         move.b    #0,$bfe801
  9583.  
  9584. .motor_wait    cmp.b    #30,$bfe801        ;wait > 500 ms
  9585.         bls.b    .motor_wait
  9586.  
  9587.         bset    d0,mot_on
  9588.  
  9589. .already_on    movem.l    (a7)+,d0/a0
  9590.         rts
  9591.  
  9592. ;Old code removed due to AT 1200 bug !
  9593.  
  9594. ;motor_wait:    cmp.b    #80,$bfe801
  9595. ;        bhi.b    .no_mot_on
  9596. ;        btst    #5,$bfe001
  9597. ;        bne.b    motor_wait
  9598. ;.out        movem.l    (a7)+,d0/a0
  9599. ;        rts
  9600.  
  9601. ;.no_mot_on    move.w    #NODISK_ERR,drive_err
  9602. ;        bra.b    .out
  9603.  
  9604. *******************************
  9605.  
  9606. motor_off:    bsr.w    rest_head
  9607.         movem.l    d0/a0,-(a7)
  9608.         lea.l    $bfd100,a0
  9609.         move.w    drive,d0
  9610.         bset    d0,(a0)
  9611.         bsr    timer1
  9612.         or.b    #$80,(a0)
  9613.         bsr    timer1
  9614.         bclr    d0,(a0)
  9615.         bsr    timer1
  9616.         bset    d0,(a0)
  9617.         bsr    timer1
  9618.         bclr    d0,mot_on
  9619.         movem.l    (a7)+,d0/a0
  9620.         rts
  9621.  
  9622. *******************************
  9623.  
  9624. ;>0.6 ms
  9625.  
  9626. timer1        movem.l    d0-d1/a6,-(a7)
  9627.         lea.l    $dff000,a6
  9628.         moveq    #10-1,d0
  9629.         cmp.b    #2,config_screen
  9630.         bne.b    .loop
  9631.         moveq    #10*2-1,d0
  9632. .loop        move.b    $6(a6),d1
  9633. .w1        cmp.b    $6(a6),d1
  9634.         beq.b    .w1
  9635.         dbf    d0,.loop
  9636.         movem.l    (a7)+,d0-d1/a6
  9637.         rts
  9638.  
  9639.  
  9640. ;>3 ms
  9641.  
  9642. timer2        movem.l    d0-d1/a6,-(a7)
  9643.         lea.l    $dff000,a6
  9644.         moveq    #50-1,d0
  9645.         cmp.b    #2,config_screen
  9646.         bne.b    .loop
  9647.         moveq    #50*2-1,d0
  9648. .loop        move.b    $6(a6),d1
  9649. .w1        cmp.b    $6(a6),d1
  9650.         beq.b    .w1
  9651.         dbf    d0,.loop
  9652.         movem.l    (a7)+,d0-d1/a6
  9653.         rts
  9654.  
  9655. ;>18 ms
  9656.  
  9657. timer3        movem.l    d0-d1/a6,-(a7)
  9658.         lea.l    $dff000,a6
  9659.         move.w    #284-1,d0
  9660.         cmp.b    #2,config_screen
  9661.         bne.b    .loop
  9662.         move.w    #284*2-1,d0
  9663. .loop        move.b    $6(a6),d1
  9664. .w1        cmp.b    $6(a6),d1
  9665.         beq.b    .w1
  9666.         dbf    d0,.loop
  9667.         movem.l    (a7)+,d0-d1/a6
  9668.         rts
  9669.  
  9670. *******************************
  9671.  
  9672. step_head:    bclr    #0,(a0)
  9673.         bsr    timer1
  9674.         bset    #0,(a0)
  9675.         bsr    timer2
  9676.         rts
  9677.  
  9678. *******************************
  9679.  
  9680. ;-------------- check which drive is present ----
  9681.  
  9682. test_drive    movem.l    d0-d3/a0-a2,-(a7)
  9683.         lea.l    $bfd100,a0
  9684.         lea.l    $bfe001,a1
  9685.         move.b    #$ff,(a0)
  9686.         lea.l    drive_present,a2
  9687.         st    (a2)+            ;DF0: always present
  9688.  
  9689.         moveq    #4,d0            ;drive1 SEL
  9690.  
  9691.         moveq    #3-1,d3            ;3 drives to test
  9692.  
  9693. .next_drive    and.b    #$7f,(a0)
  9694.         bsr    timer1
  9695.         bclr    d0,(a0)            ;switch drive ON
  9696.         bsr    timer1
  9697.         bset    d0,(a0)
  9698.         bsr    timer1
  9699.         or.b    #$80,(a0)
  9700.         bclr    d0,(a0)            ;switch drive OFF
  9701.         bsr    timer1
  9702.  
  9703.         moveq    #0,d1            ;d1=drive ID
  9704.         moveq    #32-1,d2
  9705. .loop        add.l    d1,d1
  9706.         btst    #5,(a1)            ;one bit of ID in RDY
  9707.         beq.b    .zero
  9708.         addq.l    #1,d1            ;read drive ID
  9709. .zero        bset    d0,(a0)            ;pulse SEL
  9710.         bsr    timer1
  9711.         bclr    d0,(a0)
  9712.         bsr    timer1
  9713.         dbf    d2,.loop
  9714.  
  9715.         bset    d0,(a0)            ;deselect drive
  9716.         bsr    timer1
  9717.  
  9718.         tst.l    d1
  9719.         seq    (a2)+
  9720.         addq.w    #1,d0            ;next drive
  9721.         dbf    d3,.next_drive
  9722.  
  9723.         movem.l    (a7)+,d0-d3/a0-a2
  9724.         rts
  9725.  
  9726. ******************************
  9727.  
  9728. ;-------------- init head pos -------------------
  9729.  
  9730. inittete:    movem.l    d0-d1/a0-a1,-(a7)
  9731.         lea.l    $bfd100,a0
  9732.         move.w    drive,d0
  9733.         move.w    d0,d1
  9734.         add.w    d1,d1
  9735.         btst    d0,init        ;test if the selected drive was inited
  9736.         bne.b    .no_init
  9737.         bclr    d0,(a0)
  9738.         lea.l    old_head,a1
  9739.         clr.w    -3*2(a1,d1.w)    ;save old position of head here
  9740.         bset    #1,(a0)
  9741.         bsr    timer1
  9742.  
  9743. .cont00        btst    #4,$bfe001
  9744.         beq.b    .track00
  9745.         bsr.w    step_head
  9746.         addq.w    #2,-3*2(a1,d1.w)
  9747.         bra.b    .cont00
  9748.  
  9749. .track00    lea.l    track,a1
  9750.         clr.w    -3*2(a1,d1.w)    ;current head pos = 0
  9751.         bset    d0,init
  9752.         bset    d0,(a0)
  9753.  
  9754. .no_init    movem.l    (a7)+,d0-d1/a0-a1
  9755.         rts
  9756.  
  9757. rest_head    movem.l    d0-d1/a1,-(a7)
  9758.         move.w    drive,d0
  9759.         btst    d0,init
  9760.         beq.b    .no_rest
  9761.         lea.l    $bfd100,a0
  9762.         bclr    d0,(a0)
  9763.         bsr    timer1
  9764.         bclr    d0,init
  9765.         lea.l    old_head,a1
  9766.         add.w    d0,d0
  9767.         move.w    -3*2(a1,d0.w),d0
  9768.         bsr    timer1
  9769.         bsr    settete
  9770.         move.w    drive,d0
  9771.         lea.l    track,a1
  9772.         add.w    d0,d0
  9773.         move.w    #-1,-3*2(a1,d0.w)
  9774.         bset    d0,(a0)
  9775. .no_rest    movem.l    (a7)+,d0-d1/a1
  9776.         rts
  9777.  
  9778. *******************************
  9779.  
  9780. ;d0=track to reach (0-159)
  9781.  
  9782. settete:    movem.l    d0-d4,-(a7)
  9783.         sf    d4
  9784.         bsr    timer1
  9785.         move.l    a1,-(a7)
  9786.         lea.l    track,a1
  9787.         move.w    drive,d1
  9788.         add.w    d1,d1
  9789.         move.w    -3*2(a1,d1.w),d1    ;get old pos of heads
  9790.         move.l    (a7)+,a1
  9791.         move.w    d0,d3            ;new pos
  9792.         asr.w    #1,d0
  9793.         asr.w    #1,d1
  9794.         cmp.w    d0,d1
  9795.  
  9796.         blt.b    moinstete
  9797.         bset    #1,(a0)            ;set dir
  9798.         sub.w    d0,d1
  9799.         move.w    d1,d0
  9800.         moveq    #-2,d2
  9801.         bra.b    go_dbf
  9802.  
  9803. moinstete:    bclr    #1,(a0)            ;set dir
  9804.         sub.w    d1,d0
  9805.         moveq    #2,d2
  9806.         bra.b    go_dbf
  9807.  
  9808. loop_set:    bsr.w    step_head
  9809.         st    d4
  9810.  
  9811. go_dbf:        dbf    d0,loop_set
  9812.  
  9813.         move.l    a1,-(a7)
  9814.         move.w    drive,d0
  9815.         lea.l    track,a1
  9816.         add.w    d0,d0
  9817.         move.w    d3,-3*2(a1,d0.w)    ;set new pos of heads
  9818.         move.l    (a7)+,a1
  9819.         and.w    #1,d3
  9820.         bne.b    impair
  9821.         bset    #2,(a0)
  9822.         bra.b    pair
  9823. impair:        bclr    #2,(a0)
  9824. pair:        bsr    timer2
  9825.  
  9826.         tst.b    d4
  9827.         beq.b    .nomove
  9828.         bsr    timer3
  9829. .nomove
  9830.         movem.l    (a7)+,d0-d4
  9831.         rts
  9832.  
  9833. ***************************************
  9834.  
  9835. charge:        movem.l    d0/d7/a3,-(a7)
  9836.         moveq    #5-1,d7
  9837. .loop        move.w    #$4000,$24(a6)
  9838.         bsr    timer1
  9839.         move.l    buffer,a3
  9840.         move.l    a3,$20(a6)
  9841.         move.w    #$9a00,d0        ;len=$1a00*2=$3400
  9842.         move.w    #2,$9c(a6)
  9843.         move.w    d0,$24(a6)
  9844.         move.w    d0,$24(a6)
  9845.  
  9846.         move.b    #0,$bfe801
  9847.  
  9848. .waitdmad    cmp.b    #100,$bfe801        ;wait no more than 2s
  9849.         bhi.b    .error
  9850.         move.w    $1e(a6),d0
  9851.         and.w    #2,d0
  9852.         beq.b    .waitdmad
  9853.  
  9854.         move.w    #$4000,$24(a6)
  9855.  
  9856.         bsr.b    dmfm
  9857.         beq.b    .out
  9858.         dbf    d7,.loop        ;retry
  9859.  
  9860. .error        move.w    #TRACKCORRUPT_ERR,drive_err    ;track corrupted
  9861. .out        movem.l    (a7)+,d0/d7/a3
  9862.         rts
  9863.  
  9864. ***************************************
  9865.  
  9866. dmfm:        movem.l    d0-d7/a0-a2,-(a7)
  9867.         move.l    #$55555555,d7
  9868.  
  9869.         move.l    a4,a0                ;save old status
  9870.         move.w    sectpos,oldsectpos
  9871.         move.w    startsec,oldstartsec
  9872.  
  9873.         moveq    #11-1,d4
  9874.         moveq    #0,d3
  9875.         move.l    a3,a1
  9876.         lea.l    $1a00*2(a1),a1
  9877.  
  9878. nextsector:    move.l    a3,a2
  9879.  
  9880. seek:        cmp.l    a1,a2
  9881.         bge.w    mfm_error
  9882.         cmp.w    #$4489,(a2)+
  9883.         bne.b    seek
  9884.         cmp.w    #$4489,(a2)
  9885.         beq.b    seek
  9886.         move.b    2(a2),D0
  9887.         move.b    6(a2),D1
  9888.         and.b    d7,d0
  9889.         and.b    d7,d1
  9890.         add.b    d0,d0
  9891.         or.b    d1,d0
  9892.         cmp.b    d0,d3
  9893.         beq.b    oksec
  9894.         lea.l    $43e(a2),a2
  9895.         bra.b    seek
  9896. oksec:        addq.l    #1,d3
  9897.  
  9898.         lea.l    $0028(a2),a2
  9899.  
  9900.         move.l    (a2)+,d0
  9901.         move.l    (a2)+,d1
  9902.         and.l    d7,d0
  9903.         and.l    d7,d1
  9904.         add.l    d0,d0
  9905.         or.l    d1,d0
  9906.         move.l    d0,d6
  9907.  
  9908.         move.l    a2,-(a7)
  9909.         lea.l    -$30(a2),a2
  9910.  
  9911.         moveq    #0,d0
  9912.         moveq    #$0a-1,d5
  9913. .nextcheck:    move.l    (a2)+,d1
  9914.         eor.l    d1,d0
  9915.         dbf    d5,.nextcheck
  9916.  
  9917.         move.l    (a7)+,a2
  9918.  
  9919.         and.l    d7,d0
  9920.         cmp.l    d6,d0        ;test header checksum
  9921.         bne.w    mfm_error
  9922.  
  9923.         move.l    (a2)+,d0
  9924.         move.l    (a2)+,d1
  9925.         and.l    d7,d0
  9926.         and.l    d7,d1
  9927.         add.l    d0,d0
  9928.         or.l    d1,d0
  9929.         move.l    d0,d6
  9930.  
  9931.         move.l    a2,-(a7)
  9932.  
  9933.         moveq    #0,d0
  9934.         move.w    #$100/4-1,d5
  9935. .nextcheck2:    move.l    (a2)+,d1
  9936.         eor.l    d1,d0
  9937.         move.l    (a2)+,d1
  9938.         eor.l    d1,d0
  9939.         move.l    (a2)+,d1
  9940.         eor.l    d1,d0
  9941.         move.l    (a2)+,d1
  9942.         eor.l    d1,d0
  9943.         dbf    d5,.nextcheck2
  9944.  
  9945.         move.l    (a7)+,a2
  9946.  
  9947.         and.l    d7,d0
  9948.         cmp.l    d6,d0        ;test data checksum
  9949.         bne.b    mfm_error
  9950.  
  9951.         tst.w    sectpos        ;all sectors loaded ?
  9952.         beq.b    pasokload
  9953.         tst.w    startsec;have we reached the 1st sector to load ?
  9954.         beq.b    okloadsec
  9955.         subq.w    #1,startsec
  9956.         bra.b    pasokload
  9957.  
  9958. okloadsec:    moveq    #$80-1,d5
  9959. decodemfm:    move.l    $200(a2),d1
  9960.         move.l    (a2)+,d0
  9961.         and.l    d7,d0
  9962.         and.l    d7,d1
  9963.         add.l    d0,d0
  9964.         or.l    d1,d0
  9965.         move.l    d0,(a4)+
  9966.         dbf    d5,decodemfm
  9967.  
  9968.         subq.w    #1,sectpos    ;nb sectors to load --
  9969.         bne.b    pasokload
  9970.         st    ctrl        ;set end signal
  9971.         bra.b    reload
  9972.  
  9973. pasokload:    dbf    d4,nextsector
  9974.  
  9975. reload:        movem.l    (a7)+,d0-d7/a0-a2
  9976.         moveq    #0,d0            ;ok
  9977.         rts
  9978.  
  9979. mfm_error:    move.w    oldsectpos,sectpos    ;restore status
  9980.         move.w    oldstartsec,startsec
  9981.         move.l    a0,a4
  9982.         movem.l    (a7)+,d0-d7/a0-a2
  9983.         moveq    #-1,d0            ;an error occured
  9984.         rts
  9985.  
  9986. ***************************************************
  9987.  
  9988. sauve:
  9989.         bsr.b    code_mfm
  9990.  
  9991.         move.w    #$4000,$24(a6)
  9992.         bsr    timer2
  9993.         move.l    buffer,a3
  9994.         move.l    a3,$20(a6)
  9995.         move.w    #$c000+$220*11+$2a0,d0
  9996.         move.w    #2,$9c(a6)
  9997.         move.w    d0,$24(a6)
  9998.         move.w    d0,$24(a6)
  9999.  
  10000. waitdmad2:    move.w    $1e(a6),d0
  10001.         and.w    #2,d0
  10002.         beq.b    waitdmad2
  10003.  
  10004.         move.w    #$4000,$24(a6)
  10005.  
  10006.         bsr    timer2
  10007.  
  10008.         rts
  10009.  
  10010. ***********************************
  10011. ;Code track
  10012. ;-> a4=data to be coded
  10013.  
  10014. code_mfm:    movem.l    a0-a3/d0-d7,-(a7)
  10015.  
  10016.         lea.l    track,a3
  10017.         move.w    drive,d0
  10018.         add.w    d0,d0
  10019.         move.w    -3*2(a3,d0.w),d0    ;get track no
  10020.  
  10021.         move.l    buffer,a3
  10022.  
  10023.         move.l    #$55555555,d5
  10024.         move.l    d5,d6
  10025.         add.l    d6,d6            ;d6=$aaaaaaaa
  10026.  
  10027.         tst.b    format
  10028.         beq.b    .noformat
  10029.         tst.b    first_sauve
  10030.         bne.b    .fast
  10031.  
  10032. .noformat    move.w    #$1a00*2/16-1,d1
  10033. .filla        move.l    d6,(a3)+
  10034.         move.l    d6,(a3)+
  10035.         move.l    d6,(a3)+
  10036.         move.l    d6,(a3)+
  10037.         dbf    d1,.filla
  10038.  
  10039. .fast        move.l    buffer,a3
  10040.         lea.l    $1a00*2-$440*11-$20(a3),a3
  10041.  
  10042.         bsr.b    do_track
  10043.  
  10044.         st    first_sauve
  10045.         movem.l    (a7)+,a0-a3/d0-d7
  10046.         rts
  10047.  
  10048. *******************************
  10049. ;-> a3=ptr on dest track
  10050. ;-> a4=ptr on data to write
  10051. ;-> d0=no of track
  10052.  
  10053. do_track:    move.b    d0,header+1
  10054.         move.w    #$000b,header+2
  10055.         moveq    #11-1,d4
  10056. next_sec:    bsr.b    code_sector
  10057.         lea.l    $220*2(a3),a3        ;go next sector
  10058.         add.w    #$00ff,header+2        ;inc actual sec, dec sec left
  10059.         subq.w    #1,sectpos
  10060.         dbf    d4,next_sec
  10061.  
  10062.         tst.w    sectpos
  10063.         bne.b    .noend
  10064.         st    ctrl            ;set end signal
  10065. .noend        rts
  10066.  
  10067. *******************************
  10068.  
  10069. code_sector    move.l    a3,a0
  10070.         addq.l    #4,a0
  10071.         move.l    #$44894489,(a0)+    ;sync
  10072.         move.l    header,d0
  10073.         bsr.w    code
  10074.  
  10075.         lea.l    8(a3),a0
  10076.         moveq    #10,d1
  10077.         bsr.w    chk_sum
  10078.         bsr.b    code
  10079.  
  10080.         tst.b    format
  10081.         beq.b    .no_format
  10082.         lea.l    track_buffer,a4
  10083.         tst.b    first_sauve
  10084.         bne.b    .out
  10085.         moveq    #0,d0
  10086.         move.w    #512/16-1,d7
  10087. .clear        move.l    d0,(a4)+
  10088.         move.l    d0,(a4)+
  10089.         move.l    d0,(a4)+
  10090.         move.l    d0,(a4)+
  10091.         dbf    d7,.clear
  10092.         lea.l    track_buffer,a4
  10093.         move.l    #$444f5301,(a4)        ;'DOS',1 = FFS
  10094. .no_format
  10095.         addq.l    #8,a0
  10096.         moveq    #$80-1,d7
  10097. .code_sec:    move.l    (a4)+,d0
  10098.  
  10099.         move.l    d0,d3
  10100.         lsr.l    #1,d0
  10101.         bsr.w    coder2
  10102.  
  10103.         lea.l    $200-4(a0),a0
  10104.         move.l    d3,d0
  10105.         bsr.w    coder2
  10106.         lea.l    -$200(a0),a0
  10107.  
  10108.         dbf    d7,.code_sec
  10109.  
  10110.         lea.l    $40(a3),a0
  10111.         move.w    #$100,d1
  10112.         bsr.w    chk_sum2
  10113.         lea.l    $38(a3),a0
  10114.         bsr.b    code
  10115. .out        rts
  10116.  
  10117. *******************************
  10118. ; a0 = address du buffer code
  10119. ; d0 = long word to code
  10120.  
  10121. code:        movem.l    d2/d3,-(a7)
  10122.         move.l    d0,d3
  10123.         lsr.l    #1,d0
  10124.         bsr.b    coder
  10125.         move.l    d3,d0
  10126.         bsr.b    coder2
  10127.         movem.l    (a7)+,d2/d3
  10128.         rts    
  10129.  
  10130. *******************************
  10131.  
  10132. coder:        and.l    d5,d0
  10133.         move.l    d0,d2
  10134.         eor.l    d5,d2
  10135.         move.l    d2,d1
  10136.         add.l    d2,d2
  10137.         lsr.l    #1,d1
  10138.         bset    #31,d1
  10139.         and.l    d2,d1
  10140.         or.l    d1,d0
  10141.         btst    #0,-1(a0)
  10142.         beq.b    pas_bit
  10143.         bclr    #31,d0
  10144. pas_bit:    move.l    d0,(a0)+
  10145.         rts
  10146.  
  10147. *******************************
  10148.  
  10149. chk_sum:    move.l    d2,-(a7)
  10150.         subq.w    #1,d1
  10151.         moveq    #0,d0
  10152. l_chks:        move.l    (a0)+,d2
  10153.         eor.l    d2,d0
  10154.         dbf    d1,l_chks
  10155.         and.l    d5,d0
  10156.         move.l    (a7)+,d2
  10157.         rts
  10158.  
  10159. chk_sum2:    move.l    d2,-(a7)
  10160.         subq.w    #1,d1
  10161.         moveq    #0,d0
  10162. l_chks2:    move.l    (a0)+,d2
  10163.         eor.l    d2,d0
  10164.         dbf    d1,l_chks2
  10165.         move.l    (a7)+,d2
  10166.         and.l    d5,d0
  10167.         rts
  10168.  
  10169. *******************************
  10170.  
  10171. coder2:        and.l    d5,d0
  10172.         move.l    d0,d2
  10173.         eor.l    d5,d2
  10174.         move.l    d2,d1
  10175.         add.l    d2,d2
  10176.         lsr.l    #1,d1
  10177.         bset    #31,d1
  10178.         and.l    d2,d1
  10179.         or.l    d1,d0
  10180.         btst    #0,-1(a0)
  10181.         beq.b    pas_bitx
  10182.         bclr    #31,d0
  10183. pas_bitx:    move.l    d0,(a0)+
  10184.  
  10185.         move.b    (a0),d1
  10186.         btst    #0,d0
  10187.         bne.b    bit0
  10188.         btst    #6,d1
  10189.         bne.b    bit6
  10190.         bset    #7,d1
  10191.         bra.b    go7
  10192.  
  10193. bit0:        bclr    #7,d1
  10194. go7:        move.b    d1,(a0)
  10195. bit6:        rts
  10196.  
  10197. **************************************************************************
  10198. **************************************************************************
  10199.  
  10200. ;----------------------------------------------------------
  10201.  
  10202. NODISK_ERR        equ 1
  10203. TRACKCORRUPT_ERR    equ 2
  10204. BADCHECKSUM_ERR        equ 3
  10205. NOTDOS_ERR        equ 4
  10206. WRITEPROTECT_ERR    equ 5
  10207. CREATEFILE_ERR        equ 6
  10208. FILENOTFOUND_ERR    equ 7
  10209. DISKFULL_ERR        equ 8
  10210. FILEEXIST_ERR        equ 9
  10211. DEVICENOTFOUND_ERR    equ 10
  10212. ILLEGALPATH_ERR        equ 11
  10213. NOFFS_ERR        equ 12
  10214. IDE_ERR            equ 13
  10215. NOTEMPTY_ERR        equ 14
  10216.  
  10217.         STRUCTURE partition,0
  10218.         ULONG part_next        ;ptr on next partition
  10219.         ULONG part_first    ;first sector of this partition
  10220.         ULONG part_nbsec    ;nb sectors in this partition
  10221.         ULONG part_device    ;ptr on device
  10222.         UWORD part_unit        ;unit number
  10223.         ULONG part_filesystem    ;filesystem ID (DOS\0,....) 0=nodisk
  10224.         STRUCT part_name,32    ;partition_name (BCPL) (upper case)
  10225.         STRUCT part_name2,32    ;partition_name (BCPL) (original case)
  10226.         LABEL part_SIZEOF
  10227.  
  10228.         STRUCTURE file_handle,0
  10229.         ULONG file_part        ;ptr on partition
  10230.         ULONG file_parent    ;parent
  10231.         ULONG file_header
  10232.         ULONG file_extension
  10233.         ULONG file_extpos
  10234.         ULONG file_size
  10235.         ULONG file_seek
  10236.         STRUCT file_name,32    ;1st byte=len of name (max 30) (BCPL)
  10237.         UBYTE file_written
  10238.         UBYTE file_dir        ;0=it is a file, -1 it is a dir
  10239.                     ;(used by ExNext only)
  10240.         LABEL file_SIZEOF
  10241.  
  10242.  
  10243. ;-------------- device is accesed by open,read,write,close,seek... cmd ------
  10244.  
  10245. READ_CMD equ 0
  10246. WRITE_CMD equ 4
  10247. UPDATE_CMD equ 8
  10248. MOTOFF_CMD equ 12
  10249. CHANGE_CMD equ 16
  10250. READM_CMD equ 20
  10251. WRITEM_CMD equ 24
  10252.  
  10253.     OPT_OFF
  10254. floppy_device    bra.w    floppy_read
  10255.         bra.w    floppy_write
  10256.         bra.w    floppy_update
  10257.         bra.w    floppy_motoff
  10258.         bra.w    floppy_change
  10259.         bra.w    floppy_readm
  10260.         bra.w    floppy_writem
  10261.     OPT_ON
  10262.  
  10263. ;-> a3=ptr on part
  10264. ;-> d0=no of first block to read
  10265. ;-> d1=nb of block to read
  10266. ;-> on stack=ptr on blocks
  10267.  
  10268. floppy_readm    movem.l    d0-d1/a0/a4,-(a7)
  10269.         lsl.w    #2,d1
  10270.         lea.l    4+4*4(a7,d1.w),a4
  10271.         lsr.w    #2,d1
  10272.         bra.b    .godbf
  10273. .loop        move.l    -(a4),a0
  10274.         bsr    floppy_read
  10275.         addq.l    #1,d0
  10276. .godbf        dbf    d1,.loop
  10277.         movem.l    (a7)+,d0-d1/a0/a4
  10278.         lsl.w    #2,d1
  10279.         move.l    (a7),(a7,d1.w)
  10280.         lea.l    (a7,d1.w),a7
  10281.         lsr.w    #2,d1
  10282.         rts
  10283.  
  10284. ;-> a3=ptr on part
  10285. ;-> d0=no of first block to write
  10286. ;-> d1=nb of block to write
  10287. ;-> on stack=ptr on blocks
  10288.  
  10289. floppy_writem    movem.l    d0-d1/a0/a4,-(a7)
  10290.         lsl.w    #2,d1
  10291.         lea.l    4+4*4(a7,d1.w),a4
  10292.         lsr.w    #2,d1
  10293.         bra.b    .godbf
  10294. .loop        move.l    -(a4),a0
  10295.         bsr    floppy_write
  10296.         addq.l    #1,d0
  10297. .godbf        dbf    d1,.loop
  10298.         movem.l    (a7)+,d0-d1/a0/a4
  10299.         lsl.w    #2,d1
  10300.         move.l    (a7),(a7,d1.w)
  10301.         lea.l    (a7,d1.w),a7
  10302.         lsr.w    #2,d1
  10303.         rts
  10304.  
  10305. ;-> a3=ptr on part
  10306. ;-> d0=no of block to read
  10307. ;-> a0=buffer ptr
  10308.  
  10309. floppy_read    move.l    d0,-(a7)
  10310.         add.l    part_first(a3),d0
  10311.         cmp.w    #0,part_unit(a3)        ;DF0 ?
  10312.         bne.b    .no0
  10313.         cmp.w    #3,drive
  10314.         beq.b    .read
  10315.         bsr    write_flush
  10316.         move.w    #3,drive
  10317.         move.l    d0,-(a7)
  10318.         moveq    #1,d0                ;force floppy change
  10319.         bsr    floppy_change
  10320.         move.l    (a7)+,d0
  10321.         bra.b    .read
  10322.  
  10323. .no0        cmp.w    #1,part_unit(a3)        ;DF1 ?
  10324.         bne.b    .no1
  10325.         cmp.w    #4,drive
  10326.         beq.b    .read
  10327.         bsr    write_flush
  10328.         move.w    #4,drive
  10329.         move.l    d0,-(a7)
  10330.         moveq    #1,d0                ;force floppy change
  10331.         bsr    floppy_change
  10332.         move.l    (a7)+,d0
  10333.         bra.b    .read
  10334. .no1        bra.b    .err
  10335.  
  10336. .read        bsr    read_fsector
  10337. .err        move.l    (a7)+,d0
  10338.         rts
  10339.  
  10340. ;-> a3=ptr on part
  10341. ;-> d0=no of block to write
  10342. ;-> a0=buffer ptr
  10343.  
  10344. floppy_write    move.l    d0,-(a7)
  10345.  
  10346.         bsr    signal_write
  10347.  
  10348.         add.l    part_first(a3),d0
  10349.         cmp.w    #0,part_unit(a3)        ;DF0 ?
  10350.         bne.b    .no0
  10351.         cmp.w    #3,drive
  10352.         beq.b    .write
  10353.         bsr    write_flush
  10354.         move.w    #3,drive
  10355.         move.l    d0,-(a7)
  10356.         moveq    #1,d0                ;force floppy change
  10357.         bsr    floppy_change
  10358.         move.l    (a7)+,d0
  10359.         bra.b    .write
  10360.  
  10361. .no0        cmp.w    #1,part_unit(a3)        ;DF1 ?
  10362.         bne.b    .no1
  10363.         cmp.w    #4,drive
  10364.         beq.b    .write
  10365.         bsr    write_flush
  10366.         move.w    #4,drive
  10367.         move.l    d0,-(a7)
  10368.         moveq    #1,d0                ;force floppy change
  10369.         bsr    floppy_change
  10370.         move.l    (a7)+,d0
  10371.         bra.b    .write
  10372. .no1        bra.b    .err
  10373.  
  10374. .write        bsr    write_fsector
  10375. .err        move.l    (a7)+,d0
  10376.         rts
  10377.  
  10378. ;-> a3=ptr on part
  10379.  
  10380. floppy_update    bsr    write_flush
  10381.         rts
  10382.  
  10383. ;-> a3=ptr on part
  10384.  
  10385. floppy_motoff    cmp.w    #0,part_unit(a3)        ;DF0 ?
  10386.         bne.b    .no0
  10387.         cmp.w    #3,drive
  10388.         beq.b    .motoff
  10389.         bsr    write_flush
  10390.         move.w    #3,drive
  10391.         move.l    d0,-(a7)
  10392.         moveq    #1,d0                ;force floppy change
  10393.         bsr    floppy_change
  10394.         move.l    (a7)+,d0
  10395.         bra.b    .motoff
  10396.  
  10397. .no0        cmp.w    #1,part_unit(a3)        ;DF1 ?
  10398.         bne.b    .no1
  10399.         cmp.w    #4,drive
  10400.         beq.b    .motoff
  10401.         bsr    write_flush
  10402.         move.w    #4,drive
  10403.         move.l    d0,-(a7)
  10404.         moveq    #1,d0                ;force floppy change
  10405.         bsr    floppy_change
  10406.         move.l    (a7)+,d0
  10407.         bra.b    .motoff
  10408. .no1        bra.b    .err
  10409.  
  10410. .motoff        bsr    motor_off
  10411. .err        rts
  10412.  
  10413. ;-> a3=ptr on part
  10414. ;-> d0=cmd 0=test if changed 1=force change
  10415. ;<- d0 0=nochange -1=nodisk 1=newdisk
  10416.  
  10417. floppy_change    movem.l    a0,-(a7)
  10418.         tst.l    d0
  10419.         bne.w    .force
  10420.         cmp.w    #0,part_unit(a3)        ;DF0 ?
  10421.         bne.b    .no0
  10422.         cmp.w    #3,drive
  10423.         beq.w    .gochg
  10424.         bsr    write_flush
  10425.         move.w    #3,drive
  10426.         movem.l    d0/a0,-(a7)
  10427.         lea.l    track_sector,a0
  10428.         moveq    #-1,d0
  10429.         move.l    d0,(a0)+
  10430.         move.l    d0,(a0)+
  10431.         move.l    d0,(a0)+
  10432.         move.w    d0,track_buffer_no
  10433.         movem.l    (a7)+,d0/a0
  10434.         bra.b    .gochg
  10435.  
  10436. .no0        cmp.w    #1,part_unit(a3)        ;DF1 ?
  10437.         bne.b    .no1
  10438.         cmp.w    #4,drive
  10439.         beq.b    .gochg
  10440.         bsr    write_flush
  10441.         move.w    #4,drive
  10442.         movem.l    d0/a0,-(a7)
  10443.         lea.l    track_sector,a0
  10444.         moveq    #-1,d0
  10445.         move.l    d0,(a0)+
  10446.         move.l    d0,(a0)+
  10447.         move.l    d0,(a0)+
  10448.         move.w    d0,track_buffer_no
  10449.         movem.l    (a7)+,d0/a0
  10450.         bra.b    .gochg
  10451.  
  10452. .no1        bra.w    .err
  10453.  
  10454. .force        lea.l    track_sector,a0
  10455.         moveq    #-1,d0
  10456.         move.l    d0,(a0)+
  10457.         move.l    d0,(a0)+
  10458.         move.l    d0,(a0)+
  10459.         move.w    d0,track_buffer_no
  10460.         moveq    #1,d0            ;new disk
  10461.         bra.b    .out
  10462.  
  10463. .gochg        lea.l    $bfd100,a0
  10464.         move.w    drive,d0
  10465.         bclr    d0,(a0)            ;select drive
  10466.         bclr    #1,(a0)            ;step dir -> 80
  10467.         bsr    timer1
  10468.         btst    #2,$bfe001        ;/CHNG ?
  10469.         bne.b    .nochg
  10470.  
  10471.         bsr    step_head
  10472.         bset    #1,(a0)            ;step dir -> 00
  10473.         bsr    timer1
  10474.         bsr    step_head
  10475.         bsr    timer1
  10476.         btst    #2,$bfe001
  10477.         bne.b    .newdisk
  10478.         bset    d0,(a0)            ;deselect drive
  10479.         move.w    #NODISK_ERR,drive_err
  10480.         moveq    #-1,d0            ;no disk
  10481.         bra.b    .out
  10482.  
  10483. .newdisk    bset    d0,(a0)            ;deselect drive
  10484.         lea.l    track_sector,a0
  10485.         moveq    #-1,d0
  10486.         move.l    d0,(a0)+
  10487.         move.l    d0,(a0)+
  10488.         move.l    d0,(a0)+
  10489.         move.w    d0,track_buffer_no
  10490.         moveq    #1,d0            ;new disk
  10491.         bra.b    .out
  10492.  
  10493. .nochg        bset    d0,(a0)            ;deselect drive
  10494.         moveq    #0,d0            ;no change
  10495.         bra.b    .out
  10496.  
  10497. .err        moveq    #1,d0
  10498. .out        movem.l    (a7)+,a0
  10499.         rts
  10500.  
  10501.  
  10502.     OPT_OFF
  10503. ide_device    bra.w    ide_read
  10504.         bra.w    ide_write
  10505.         bra.w    ide_update
  10506.         bra.w    ide_motoff
  10507.         bra.w    ide_change
  10508.         bra.w    ide_readm
  10509.         bra.w    ide_writem
  10510.     OPT_ON
  10511.  
  10512. ;-> a3=ptr on part
  10513. ;-> d0=no of first block to read
  10514. ;-> d1=nb of block to read
  10515. ;-> on stack=ptr on blocks
  10516.  
  10517. ide_readm    movem.l    d0-d1/a0/a4,-(a7)
  10518.         lsl.w    #2,d1
  10519.         lea.l    4+4*4(a7,d1.w),a4
  10520.         lsr.w    #2,d1
  10521.         bra.b    .godbf
  10522. .loop        move.l    -(a4),a0
  10523.         bsr    ide_read
  10524.         addq.l    #1,d0
  10525. .godbf        dbf    d1,.loop
  10526.         movem.l    (a7)+,d0-d1/a0/a4
  10527.         lsl.w    #2,d1
  10528.         move.l    (a7),(a7,d1.w)
  10529.         lea.l    (a7,d1.w),a7
  10530.         lsr.w    #2,d1
  10531.         rts
  10532.  
  10533. ;-> a3=ptr on part
  10534. ;-> d0=no of first block to write
  10535. ;-> d1=nb of block to write
  10536. ;-> on stack=ptr on blocks
  10537.  
  10538.  
  10539. ide_writem    movem.l    d0-d2/a0,-(a7)
  10540.  
  10541.         bsr    signal_write
  10542.  
  10543.         add.l    part_first(a3),d0
  10544.  
  10545.         lsl.w    #2,d1
  10546.         lea.l    4+4*4(a7,d1.w),a0
  10547.         lsr.w    #2,d1
  10548.  
  10549.         move.w    d1,d2
  10550.         move.w    part_unit(a3),d1
  10551.         bsr    WriteM_Block
  10552.  
  10553.         tst.l    d0
  10554.         beq.b    .noerr
  10555. .err        move.w    #IDE_ERR,drive_err
  10556. .noerr
  10557.         movem.l    (a7)+,d0-d2/a0
  10558.         add.w    d1,d1
  10559.         add.w    d1,d1
  10560.         move.l    (a7),(a7,d1.w)
  10561.         lea.l    (a7,d1.w),a7
  10562.         lsr.w    #2,d1
  10563.         rts
  10564.  
  10565. ;-> a3 = part
  10566.  
  10567. signal_write    movem.l    d2/a0/a3,-(a7)
  10568.         lea.l    changed_disk,a0
  10569.         moveq    #16-1,d2
  10570. .seek        cmp.l    (a0)+,a3
  10571.         beq.b    .found
  10572.         dbf    d2,.seek
  10573.  
  10574.         lea.l    changed_disk,a0
  10575. .seek2        tst.l    (a0)+
  10576.         bne.b    .seek2
  10577.         move.l    a3,-4(a0)
  10578.  
  10579. .found        movem.l    (a7)+,d2/a0/a3
  10580.         rts
  10581.  
  10582.  
  10583. ;-> d0=block no
  10584. ;-> a0=address
  10585. ;-> a3=part
  10586.  
  10587. ide_read    movem.l    d0-d1,-(a7)
  10588.         cmp.l    part_nbsec(a3),d0
  10589.         bge.b    .err
  10590.         add.l    part_first(a3),d0
  10591.         move.w    part_unit(a3),d1
  10592.         bsr    Read_Block
  10593.         tst.l    d0
  10594.         beq.b    .noerr
  10595. .err        move.w    #IDE_ERR,drive_err
  10596. .noerr        movem.l    (a7)+,d0-d1
  10597.         rts
  10598.  
  10599. ;-> d0=block no
  10600. ;-> a0=address
  10601. ;-> a3=part
  10602.  
  10603. ide_write    movem.l    d0-d1,-(a7)
  10604.  
  10605.         bsr    signal_write
  10606.  
  10607.         cmp.l    part_nbsec(a3),d0
  10608.         bge.b    .err
  10609.         add.l    part_first(a3),d0
  10610.         move.w    part_unit(a3),d1
  10611.         bsr    Write_Block
  10612.         tst.l    d0
  10613.         beq.b    .noerr
  10614. .err        move.w    #IDE_ERR,drive_err
  10615. .noerr        movem.l    (a7)+,d0-d1
  10616.         rts
  10617.  
  10618. ide_update    rts
  10619. ide_motoff    rts
  10620. ide_change    moveq    #0,d0        ;no change
  10621.         rts
  10622.  
  10623. ;-------------- find the partitions on the HardDisks ------
  10624.  
  10625. find_part    movem.l    d0-a4,-(a7)
  10626.  
  10627.         lea.l    floppy0,a1
  10628. .seekend    move.l    (a1),d1
  10629.         beq.b    .endoflist
  10630.         move.l    d1,a1
  10631.         bra.b    .seekend
  10632.  
  10633. .endoflist    lea.l    secbuf,a0
  10634.         moveq    #0,d1
  10635.         bsr    Read_ID
  10636.         tst.l    d0
  10637.         bne.b    .nodrive0
  10638.         bsr    .search_part
  10639. .nodrive0
  10640.         tst.b    config_elsat
  10641.         bne.b    .nodrive1
  10642.         lea.l    secbuf,a0
  10643.         moveq    #1,d1
  10644.         bsr    Read_ID
  10645.         tst.l    d0
  10646.         bne.b    .nodrive1
  10647.         bsr    .search_part
  10648. .nodrive1
  10649.         lea.l    secbuf,a0
  10650.         moveq    #0,d1
  10651.         moveq    #0,d0
  10652.         tst.w    IDE_info0
  10653.         beq.b    .no0
  10654.         bsr    Read_Block
  10655. .no0
  10656.         movem.l    (a7)+,d0-a4
  10657.         rts
  10658.  
  10659. ;-------------- search partitions in rigid disk blocks ----
  10660.  
  10661. ;-> d1=drive no (unit)
  10662. ;-> a1=last partition
  10663.  
  10664. .search_part
  10665.         moveq    #0,d6
  10666. .seek        lea.l    secbuf,a0
  10667.         move.l    d6,d0
  10668.         bsr    Read_Block    ;read first RDSK
  10669.         cmp.l    #"RDSK",(a0)
  10670.         beq.b    .okrdsk
  10671.         addq.l    #1,d6
  10672.         cmp.l    #RDB_LOCATION_LIMIT,d6
  10673.         beq.w    .error
  10674.         bra.b    .seek
  10675. .okrdsk        move.l    rdb_CylBlocks(a0),d6
  10676.         move.l    rdb_PartitionList(a0),d0
  10677.         beq.w    .error
  10678. .read_next    moveq    #-1,d2
  10679.         cmp.l    d2,d0        ;end of list ?
  10680.         beq.w    .error
  10681.         bsr    Read_Block    ;read PART
  10682.         cmp.l    #"PART",(a0)
  10683.         bne.w    .error
  10684.         move.l    192(a0),d0
  10685.         lsr.l    #8,d0
  10686.         cmp.l    #"DOS",d0    ;Amiga DOS filesystem ?
  10687.         bne.w    .next
  10688.  
  10689.         lea.l    part_SIZEOF(a1),a2
  10690.         cmp.l    #harddisk_end,a2    ;max nb of part reached ?
  10691.         bge.w    .error
  10692.  
  10693.         move.l    a2,part_next(a1)
  10694.         move.l    a2,a1
  10695.         clr.l    part_next(a1)
  10696.  
  10697.         lea.l    pb_DriveName(a0),a2
  10698.         lea.l    part_name(a1),a3
  10699.         lea.l    part_name2(a1),a4
  10700.         clr.l    (a3)        ;clear DF1: name if needed
  10701.         moveq    #0,d2
  10702.         move.b    (a2)+,d2
  10703.         move.b    d2,(a3)+    ;copy name length
  10704.         move.b    d2,(a4)+
  10705.         bra.b    .godbf2
  10706. .copyn        move.b    (a2)+,d0
  10707.         move.b    d0,(a4)+
  10708.         bsr    upper_case
  10709.         move.b    d0,(a3)+    ;copy Partition name
  10710. .godbf2        dbf    d2,.copyn
  10711.  
  10712.         move.l    $a4(a0),d0    ;First cylinder
  10713.         mulu    d6,d0        ;d0=first sector
  10714.         move.l    d0,part_first(a1)
  10715.         move.l    $a8(a0),d2    ;last cylinder
  10716.         addq.w    #1,d2
  10717.         mulu    d6,d2        ;last sector+1
  10718.         sub.l    d0,d2
  10719.         move.l    d2,part_nbsec(a1)
  10720.         move.w    d1,part_unit(a1)
  10721.  
  10722.         move.l    #ide_device,part_device(a1)
  10723.  
  10724.         lea.l    extension,a0
  10725.         bsr    Read_Block    ;Read first sector
  10726.         move.l    (a0),part_filesystem(a1)
  10727.         lea.l    secbuf,a0
  10728.  
  10729. .next        move.l    pb_Next(a0),d0
  10730.         bne.w    .read_next
  10731.  
  10732. .error        rts
  10733.  
  10734. ;----------------------------------------------------------
  10735.  
  10736. ide_base    dc.l 0        ;$da2000 / $dd2020 / $EB8000 (A1200,A4000,CD32elsat)
  10737. ide_irq        dc.l 0        ;$da9000 / $dd3020 / $0
  10738.  
  10739. ide_data    dc.w 0
  10740. ide_error    dc.w 0
  10741. ide_feature    dc.w 0
  10742. ide_secnt    dc.w 0
  10743. ide_secnb    dc.w 0
  10744. ide_cyllo    dc.w 0
  10745. ide_cylhi    dc.w 0
  10746. ide_dhead    dc.w 0
  10747. ide_status    dc.w 0
  10748. ide_command    dc.w 0
  10749. ide_altstat    dc.w 0
  10750.  
  10751. ;$da8000+$1000 interrupt register
  10752.  
  10753. ;-> a0=ID_Buffer
  10754. ;-> d1=drive no (0/1)
  10755. ;<- d0=error 0=ok -1=an error occured (No Drive)
  10756.  
  10757. Read_ID        movem.l    d1-d2/a0-a1/a3,-(a7)
  10758.         lea.l    IDE_info0,a1
  10759.         tst.w    d1
  10760.         beq.b    .okdrive0
  10761.         lea.l    IDE_info1,a1
  10762. .okdrive0
  10763.         move.l    ide_base(pc),a3
  10764.  
  10765.         move.b    #0,$bfe801
  10766. .wait        cmp.b    #80,$bfe801
  10767.         bhi.w    .error
  10768.         move.w    ide_status,d0
  10769.         tst.b    (a3,d0.w)
  10770.         bmi.b    .wait            ;BUSY ?
  10771.  
  10772.         lsl.b    #4,d1
  10773.         and.b    #$10,d1            ;Drive bit
  10774.         or.b    #$a0,d1
  10775.         move.w    ide_dhead,d0
  10776.         move.b    d1,(a3,d0.w)
  10777.         move.w    ide_command,d0
  10778.         move.b    #$EC,(a3,d0.w)        ;Identify Drive cmd
  10779.  
  10780.         bsr    wait_irq2
  10781.         bne.b    .error
  10782.  
  10783.         move.w    ide_status,d0
  10784.         move.b    (a3,d0.w),d0
  10785.         btst    #0,d0
  10786.         bne.b    .error
  10787.  
  10788.         movem.l    a0/a1,-(a7)
  10789.         move.w    ide_data,d0
  10790.         lea.l    (a3,d0.w),a1
  10791.         move.w    #512/2-1,d0
  10792. .copy        move.w    (a1),d1
  10793.         ror.w    #8,d1            ;LittleEndian to BigEndian
  10794.         move.w    d1,(a0)+
  10795.         dbf    d0,.copy
  10796.         movem.l    (a7)+,a0/a1
  10797.  
  10798.         move.w    1*2(a0),II_NbCyl(a1)
  10799.         move.w    3*2(a0),II_NbHeads(a1)
  10800.         move.w    6*2(a0),II_NbSecTrack(a1)
  10801.         moveq    #0,d1
  10802.         move.w    59*2(a0),d0
  10803.         btst    #8,d0            ;setting valid ?
  10804.         beq.b    .nomult
  10805.         move.b    d0,d1
  10806. .nomult        move.w    d1,II_MultSize(a1)
  10807.  
  10808.         move.w    ide_status,d0
  10809.         move.b    (a3,d0.w),d0
  10810.         btst    #0,d0
  10811.         bne.b    .error
  10812.         moveq    #0,d0
  10813.         bra.b    .out
  10814. .error        moveq    #-1,d0
  10815. .out        movem.l    (a7)+,d1-d2/a0-a1/a3
  10816.         rts
  10817.  
  10818. ;-> a3=ide_base
  10819. wait_irq    movem.l    d0/a0,-(a7)
  10820.         tst.l    ide_irq
  10821.         bne.b    .nocd32
  10822.         move.w    ide_altstat,d0
  10823. .busy        tst.b    (a3,d0.w)
  10824.         bmi.b    .busy
  10825.         move.w    ide_status,d0
  10826.         move.b    (a3,d0.w),d0        ;ack int
  10827.         bra.b    .ok
  10828. .nocd32
  10829. .noirq        move.l    ide_irq(pc),a0
  10830.         move.b    (a0),d0
  10831.         bpl.b    .noirq
  10832.         tst.b    config_A1200
  10833.         bne.b    .go1200
  10834.         move.w    ide_status,d0
  10835.         move.b    (a3,d0.w),d0
  10836.         bra.b    .ok
  10837. .go1200        move.w    SR,-(a7)
  10838.         move.w    #$2700,sr
  10839.         move.w    ide_status,d0
  10840.         move.b    (a3,d0.w),d0
  10841.         move.b    (a0),d0
  10842.         andi.b    #3,d0
  10843.         or.b    #$7c,d0
  10844.         move.b    d0,(a0)
  10845.         move.w    (a7)+,SR
  10846. .ok
  10847.         movem.l    (a7)+,d0/a0
  10848.         rts
  10849.  
  10850.  
  10851. ;same as wait_irq but doesn't wait more than 80 ticks
  10852. ;-> a3=ide_base
  10853. ;<- Z flag RESULT unset=ERROR set=OK
  10854.  
  10855. wait_irq2    movem.l    d0/a0,-(a7)
  10856.  
  10857.         tst.l    ide_irq
  10858.         bne.b    .nocd32
  10859.         move.b    #0,$bfe801
  10860. .loop        cmp.b    #80,$bfe801
  10861.         bhi.w    .err
  10862.         move.w    ide_altstat,d0
  10863.         move.b    (a3,d0.w),d0
  10864.         bpl.b    .ok2
  10865.         bra.b    .loop
  10866. .ok2        move.w    ide_status,d0
  10867.         move.b    (a3,d0.w),d0        ;ack int
  10868.         btst    #0,d0
  10869.         bne.w    .err
  10870.         jmp    .ok
  10871.  
  10872. .nocd32
  10873.         move.b    #0,$bfe801
  10874. .noirq        cmp.b    #80,$bfe801
  10875.         bhi.b    .err
  10876.         move.l    ide_irq(pc),a0
  10877.         move.b    (a0),d0
  10878.         bpl.b    .noirq
  10879.         tst.b    config_A1200
  10880.         bne.b    .go1200
  10881.         move.w    ide_status,d0
  10882.         move.b    (a3,d0.w),d0
  10883.         bra.b    .ok
  10884. .go1200        move.w    SR,-(a7)
  10885.         move.w    #$2700,sr
  10886.         move.w    ide_status,d0
  10887.         move.b    (a3,d0.w),d0
  10888.         move.b    (a0),d0
  10889.         andi.b    #3,d0
  10890.         or.b    #$7c,d0
  10891.         move.b    d0,(a0)
  10892.         move.w    (a7)+,SR
  10893. .ok        moveq    #0,d0
  10894.         movem.l    (a7)+,d0/a0
  10895.         rts
  10896.  
  10897. .err        moveq    #-1,d0
  10898.         movem.l    (a7)+,d0/a0
  10899.         rts
  10900.  
  10901.  
  10902. ;-> d0=block no
  10903. ;-> d1=drive no (0/1)
  10904. ;-> a0=dest address
  10905.  
  10906. Read_Block    movem.l    d1-d2/a0-a1/a3,-(a7)
  10907.  
  10908.         lea.l    IDE_info0,a1
  10909.         tst.w    d1
  10910.         beq.b    .okdrive0
  10911.         lea.l    IDE_info1,a1
  10912. .okdrive0
  10913.         tst.w    (a1)            ;drive exists ?
  10914.         beq.w    .error
  10915.  
  10916.         move.l    ide_base(pc),a3
  10917.  
  10918. .wait        move.w    ide_status,d2
  10919.         tst.b    (a3,d2.w)
  10920.         bmi.b    .wait            ;BUSY ?
  10921.  
  10922.         lsl.b    #4,d1
  10923.         and.b    #$10,d1            ;Drive bit
  10924.         or.b    #$a0,d1
  10925.  
  10926.         move.w    II_NbHeads(a1),d2    ;nb_heads
  10927.         mulu    II_NbSecTrack(a1),d2    ;*nb_sectrack d2=nb sec/cyl
  10928.         tst.w    d2
  10929.         beq.w    .error
  10930.         divu    d2,d0            ;d0=cyl no.
  10931.         cmp.w    II_NbCyl(a1),d0        ;nb_cyl
  10932.         bge.w    .error
  10933.  
  10934.         move.w    ide_cyllo,d2
  10935.         move.b    d0,(a3,d2.w)
  10936.         lsr.w    #8,d0
  10937.         move.w    ide_cylhi,d2
  10938.         move.b    d0,(a3,d2.w)
  10939.         clr.w    d0
  10940.         swap    d0
  10941.         divu    II_NbSecTrack(a1),d0    ;/nb_sectrack d0=no of head
  10942.         and.w    #%1111,d0
  10943.         or.b    d0,d1
  10944.         swap    d0
  10945.         cmp.w    II_NbSecTrack(a1),d0    ;nb_sectrack
  10946.         bge.w    .error
  10947.         addq.b    #1,d0
  10948.         move.w    ide_secnb,d2
  10949.         move.b    d0,(a3,d2.w)        ;start sector
  10950.  
  10951.         move.w    ide_dhead,d2
  10952.         move.b    d1,(a3,d2.w)
  10953.         move.w    ide_secnt,d2
  10954.         move.b    #1,(a3,d2.w)        ;read 1 sector
  10955.  
  10956.         move.w    ide_command,d2
  10957.         move.b    #$20,(a3,d2.w)        ;Read Drive cmd
  10958.  
  10959.         bsr    wait_irq
  10960.  
  10961.         move.w    ide_status,d0
  10962.         move.b    (a3,d0.w),d0
  10963.         btst    #0,d0
  10964.         bne.b    .error
  10965.  
  10966.         move.w    ide_data,d0
  10967.         lea.l    (a3,d0.w),a1
  10968.         move.w    #512/32-1,d0
  10969. .read        move.w    (a1),(a0)+
  10970.         move.w    (a1),(a0)+
  10971.         move.w    (a1),(a0)+
  10972.         move.w    (a1),(a0)+
  10973.         move.w    (a1),(a0)+
  10974.         move.w    (a1),(a0)+
  10975.         move.w    (a1),(a0)+
  10976.         move.w    (a1),(a0)+
  10977.         move.w    (a1),(a0)+
  10978.         move.w    (a1),(a0)+
  10979.         move.w    (a1),(a0)+
  10980.         move.w    (a1),(a0)+
  10981.         move.w    (a1),(a0)+
  10982.         move.w    (a1),(a0)+
  10983.         move.w    (a1),(a0)+
  10984.         move.w    (a1),(a0)+
  10985.         dbf    d0,.read
  10986.  
  10987.         move.w    ide_status,d0
  10988.         move.b    (a3,d0.w),d0
  10989.         btst    #0,d0
  10990.         bne.b    .error
  10991.         moveq    #0,d0
  10992.         bra.b    .out
  10993. .error        moveq    #-1,d0
  10994. .out        movem.l    (a7)+,d1-d2/a0-a1/a3
  10995.         rts
  10996.  
  10997.  
  10998. ;-> d0=block no
  10999. ;-> d1=drive no (0/1)
  11000. ;-> a0=source address
  11001.  
  11002. Write_Block    movem.l    d1-d2/a0-a1/a3,-(a7)
  11003.  
  11004.         lea.l    IDE_info0,a1
  11005.         tst.w    d1
  11006.         beq.b    .okdrive0
  11007.         lea.l    IDE_info1,a1
  11008. .okdrive0
  11009.         tst.w    (a1)            ;drive exists ?
  11010.         beq.w    .error
  11011.  
  11012.         move.l    ide_base(pc),a3
  11013.  
  11014. .wait        move.w    ide_status,d2
  11015.         tst.b    (a3,d2.w)
  11016.         bmi.b    .wait            ;BUSY ?
  11017.  
  11018.         lsl.b    #4,d1
  11019.         and.b    #$10,d1            ;Drive bit
  11020.         or.b    #$a0,d1
  11021.  
  11022.         move.w    II_NbHeads(a1),d2    ;nb_heads
  11023.         mulu    II_NbSecTrack(a1),d2    ;*nb_sectrack d2=nb sec/cyl
  11024.         divu    d2,d0            ;d0=cyl no.
  11025.         tst.w    d2
  11026.         beq.w    .error
  11027.         cmp.w    II_NbCyl(a1),d0        ;nb_cyl
  11028.         bge.w    .error
  11029.  
  11030.         move.w    ide_cyllo,d2
  11031.         move.b    d0,(a3,d2.w)
  11032.         lsr.w    #8,d0
  11033.         move.w    ide_cylhi,d2
  11034.         move.b    d0,(a3,d2.w)
  11035.         clr.w    d0
  11036.         swap    d0
  11037.         divu    II_NbSecTrack(a1),d0    ;/nb_sectrack d0=no of head
  11038.         and.w    #%1111,d0
  11039.         or.b    d0,d1
  11040.         swap    d0
  11041.         cmp.w    II_NbSecTrack(a1),d0    ;nb_sectrack
  11042.         bge.w    .error
  11043.         addq.b    #1,d0
  11044.         move.w    ide_secnb,d2
  11045.         move.b    d0,(a3,d2.w)        ;start sector
  11046.  
  11047.         move.w    ide_dhead,d2
  11048.         move.b    d1,(a3,d2.w)
  11049.         move.w    ide_secnt,d2
  11050.         move.b    #1,(a3,d2.w)        ;read 1 sector
  11051.  
  11052.         move.w    ide_command,d2
  11053.         move.b    #$30,(a3,d2.w)        ;Write Drive cmd
  11054.  
  11055. .busy        move.w    ide_status,d0
  11056.         move.b    (a3,d0.w),d0
  11057.         bmi.b    .busy
  11058.         btst    #0,d0
  11059.         bne.b    .error
  11060.         btst    #3,d0            ;DRQ ?
  11061.         beq.b    .busy
  11062.  
  11063.         move.w    ide_data,d0
  11064.         lea.l    (a3,d0.w),a1
  11065.         move.w    #512/32-1,d0
  11066. .write        move.w    (a0)+,(a1)
  11067.         move.w    (a0)+,(a1)
  11068.         move.w    (a0)+,(a1)
  11069.         move.w    (a0)+,(a1)
  11070.         move.w    (a0)+,(a1)
  11071.         move.w    (a0)+,(a1)
  11072.         move.w    (a0)+,(a1)
  11073.         move.w    (a0)+,(a1)
  11074.         move.w    (a0)+,(a1)
  11075.         move.w    (a0)+,(a1)
  11076.         move.w    (a0)+,(a1)
  11077.         move.w    (a0)+,(a1)
  11078.         move.w    (a0)+,(a1)
  11079.         move.w    (a0)+,(a1)
  11080.         move.w    (a0)+,(a1)
  11081.         move.w    (a0)+,(a1)
  11082.         dbf    d0,.write
  11083.  
  11084.         bsr    wait_irq
  11085.  
  11086. .busy2        move.w    ide_status,d0
  11087.         move.b    (a3,d0.w),d0
  11088.         btst    #0,d0
  11089.         bne.b    .error
  11090.         btst    #7,d0
  11091.         bne.b    .busy2
  11092.         moveq    #0,d0
  11093.         bra.b    .out
  11094. .error        moveq    #-1,d0
  11095. .out        movem.l    (a7)+,d1-d2/a0-a1/a3
  11096.         rts
  11097.  
  11098. ;-> d0=block no
  11099. ;-> d1=drive no (0/1)
  11100. ;-> d2=nb ok blocks to write
  11101. ;-> a0=ptr on top of stack of source address
  11102.  
  11103.  
  11104. WriteM_Block    movem.l    d1-d3/a0-a3,-(a7)
  11105.  
  11106.         lea.l    IDE_info0,a1
  11107.         tst.w    d1
  11108.         beq.b    .okdrive0
  11109.         lea.l    IDE_info1,a1
  11110. .okdrive0
  11111.         tst.w    d2
  11112.         beq.w    .error
  11113.  
  11114.         tst.w    (a1)            ;drive exists ?
  11115.         beq.w    .error
  11116.  
  11117.         move.l    ide_base(pc),a3
  11118.  
  11119. .wait        move.w    ide_status,d3
  11120.         tst.b    (a3,d3.w)
  11121.         bmi.b    .wait            ;BUSY ?
  11122.  
  11123.         lsl.b    #4,d1
  11124.         and.b    #$10,d1            ;Drive bit
  11125.         or.b    #$a0,d1
  11126.  
  11127.         move.w    II_NbHeads(a1),d3    ;nb_heads
  11128.         mulu    II_NbSecTrack(a1),d3    ;*nb_sectrack d3=nb sec/cyl
  11129.         tst.w    d3
  11130.         beq.w    .error
  11131.         divu    d3,d0            ;d0=cyl no.
  11132.         cmp.w    II_NbCyl(a1),d0        ;nb_cyl
  11133.         bge.w    .error
  11134.  
  11135.         move.w    ide_cyllo,d3
  11136.         move.b    d0,(a3,d3.w)
  11137.         lsr.w    #8,d0
  11138.         move.w    ide_cylhi,d3
  11139.         move.b    d0,(a3,d3.w)
  11140.         clr.w    d0
  11141.         swap    d0
  11142.         divu    II_NbSecTrack(a1),d0    ;/nb_sectrack d0=no of head
  11143.         and.w    #%1111,d0
  11144.         or.b    d0,d1
  11145.         swap    d0
  11146.         cmp.w    II_NbSecTrack(a1),d0    ;nb_sectrack
  11147.         bge.w    .error
  11148.         addq.b    #1,d0
  11149.         move.w    ide_secnb,d3
  11150.         move.b    d0,(a3,d3.w)        ;start sector
  11151.  
  11152.         move.w    ide_dhead,d3
  11153.         move.b    d1,(a3,d3.w)
  11154.  
  11155.         move.w    ide_secnt,d3
  11156.         move.b    d2,(a3,d3.w)        ;write d2 sectors
  11157.  
  11158.         moveq    #$30,d0            ;WriteSector
  11159.         move.w    ide_command,d3
  11160.         move.b    d0,(a3,d3.w)        ;Drive cmd
  11161.  
  11162.         subq.w    #1,d2            ;for dbf
  11163.  
  11164. .busy        move.w    ide_status,d0
  11165.         move.b    (a3,d0.w),d0
  11166.         bmi.b    .busy
  11167.         btst    #0,d0
  11168.         bne.b    .error
  11169.         btst    #3,d0            ;DRQ ?
  11170.         beq.b    .busy
  11171.  
  11172.         move.l    -(a0),a2        ;get next block address
  11173.  
  11174.         move.w    ide_data,d0
  11175.         lea.l    (a3,d0.w),a1
  11176.  
  11177.         move.w    #512/32-1,d0
  11178. .write        move.w    (a2)+,(a1)
  11179.         move.w    (a2)+,(a1)
  11180.         move.w    (a2)+,(a1)
  11181.         move.w    (a2)+,(a1)
  11182.         move.w    (a2)+,(a1)
  11183.         move.w    (a2)+,(a1)
  11184.         move.w    (a2)+,(a1)
  11185.         move.w    (a2)+,(a1)
  11186.         move.w    (a2)+,(a1)
  11187.         move.w    (a2)+,(a1)
  11188.         move.w    (a2)+,(a1)
  11189.         move.w    (a2)+,(a1)
  11190.         move.w    (a2)+,(a1)
  11191.         move.w    (a2)+,(a1)
  11192.         move.w    (a2)+,(a1)
  11193.         move.w    (a2)+,(a1)
  11194.         dbf    d0,.write
  11195.  
  11196.         bsr    wait_irq
  11197.  
  11198.         dbf    d2,.busy
  11199.  
  11200. .busy2        move.w    ide_status,d0
  11201.         move.b    (a3,d0.w),d0
  11202.         btst    #0,d0
  11203.         bne.b    .error
  11204.         btst    #7,d0
  11205.         bne.b    .busy2
  11206.         moveq    #0,d0
  11207.         bra.b    .out
  11208. .error        moveq    #-1,d0
  11209. .out        movem.l    (a7)+,d1-d3/a0-a3
  11210.         rts
  11211.  
  11212. ****************************************************************
  11213.  
  11214.         include src/file.s
  11215.         include src/fbuffers.s
  11216.         include src/cmd_p.s
  11217.         include src/cmd_sp.s
  11218.  
  11219. **************************************************************************
  11220. ;-------------- read the palette from custom registers -------------------
  11221.  
  11222. read_palette    movem.l    d0-d2/a0-a1,-(a7)
  11223.         tst.b    config_AGA
  11224.         beq.b    .noaga
  11225.         move.w    #$0100,$104(a6)        ;set read mode
  11226.         lea.l    paletteL,a0
  11227.         move.w    #$200,d0
  11228.         moveq    #8-1,d1
  11229. .loop_bank    move.w    d0,$106(a6)
  11230.         lea.l    $180(a6),a1
  11231.         moveq    #32-1,d2
  11232. .color        move.w    (a1)+,(a0)+        ;copy bank
  11233.         dbf    d2,.color
  11234.         add.w    #$2000,d0
  11235.         dbf    d1,.loop_bank
  11236.  
  11237.         lea.l    paletteH,a0
  11238.         moveq    #0,d0
  11239.         moveq    #8-1,d1
  11240. .loop_bank2    move.w    d0,$106(a6)
  11241.         lea.l    $180(a6),a1
  11242.         moveq    #32-1,d2
  11243. .color2        move.w    (a1)+,(a0)+        ;copy bank
  11244.         dbf    d2,.color2
  11245.         add.w    #$2000,d0
  11246.         dbf    d1,.loop_bank2
  11247.         move.w    #0,$104(a6)        ;set write mode
  11248. .noaga        movem.l    (a7)+,d0-d2/a0-a1
  11249.         rts
  11250.  
  11251. restore_palette    movem.l    d0-d2/a0-a1,-(a7)
  11252.         tst.b    config_AGA
  11253.         beq.b    .noaga
  11254.  
  11255.         lea.l    paletteH,a0
  11256.         moveq    #0,d0
  11257.         moveq    #8-1,d1
  11258. .loop_bank2    move.w    d0,$106(a6)
  11259.         lea.l    $180(a6),a1
  11260.         moveq    #32-1,d2
  11261. .color2        move.w    (a0)+,(a1)+        ;copy bank
  11262.         dbf    d2,.color2
  11263.         add.w    #$2000,d0
  11264.         dbf    d1,.loop_bank2
  11265.  
  11266.         lea.l    paletteL,a0
  11267.         move.w    #$200,d0
  11268.         moveq    #8-1,d1
  11269. .loop_bank    move.w    d0,$106(a6)
  11270.         lea.l    $180(a6),a1
  11271.         moveq    #32-1,d2
  11272. .color        move.w    (a0)+,(a1)+        ;copy bank
  11273.         dbf    d2,.color
  11274.         add.w    #$2000,d0
  11275.         dbf    d1,.loop_bank
  11276.  
  11277.         move.w    custom+$10c,$10c(a6)    ;for palette EOR
  11278.  
  11279.         move.w    #0,$106(a6)
  11280.  
  11281. .noaga        movem.l    (a7)+,d0-d2/a0-a1
  11282.         rts
  11283.  
  11284.  
  11285. **************************************************************************
  11286. ;-------------- SCAN scan memory for samples -----------------------------
  11287.  
  11288. cmd_scan    jmp    end_command
  11289.  
  11290. **************************************************************************
  11291. *************** MMU routines *********************************************
  11292. **************************************************************************
  11293.  
  11294. ;set a page mode
  11295. ;-> a0 address
  11296. ;-> mode 0=normal, 1=write protected, read/write protected
  11297. ;<- d0 error (0=ok)
  11298.  
  11299.  
  11300. mmu_set_page:
  11301.         cmp.w    #4,proc_type
  11302.         blt.b    .err
  11303.  
  11304. ;-------------- 68040/68060 MMU -----------
  11305.         nop
  11306.  
  11307. .err        moveq    #-1,d0
  11308.         rts
  11309.  
  11310. **************************************************************************
  11311. ;--------------
  11312. ; shows the reason because HrtMon was entered
  11313. ; it will only output something if the reason is different than
  11314. ; NMI and PORTS
  11315. ; IN:    - a0 = stackframe
  11316. ; OUT:    -
  11317.  
  11318. _ShowEntryReason
  11319.         movem.l    d0-a6,-(a7)
  11320.         moveq    #1,d0
  11321.         cmp.w    proc_type,d0
  11322.         bhs    .end
  11323.         moveq    #0,d0
  11324.         move.w    (6,a0),d0        ;format
  11325.         cmp.w    #$68,d0            ;keyboard
  11326.         beq    .end
  11327.         cmp.w    #$7c,d0            ;NMI
  11328.         beq    .end
  11329.         lea    .str,a0
  11330.         bsr    print
  11331.         moveq    #4,d1
  11332.         bsr    print_hex
  11333.         lea    .spc,a0
  11334.         bsr    print
  11335.         and.w    #$fff,d0
  11336.         lsr.w    #2,d0
  11337.         lea    _exceptionnames,a0
  11338.         bsr    _DoStringNull
  11339.         move.l    d0,a0
  11340.         tst.l    d0
  11341.         bne    .known
  11342.         lea    .unknown,a0
  11343. .known        bsr    print
  11344.         bsr    _PrintLn
  11345. .end        movem.l    (a7)+,d0-a6
  11346.         rts
  11347.  
  11348. .str        dc.b    "$",0
  11349. .spc        dc.b    " ",0
  11350. .unknown    dc.b    "undefined entry into HrtMon",0
  11351.         even
  11352.  
  11353. ;--------------
  11354. ; prints a newline
  11355. ; IN:    -
  11356. ; OUT:    -
  11357.  
  11358. _PrintLn    lea    .lf,a0
  11359.         bra    print
  11360.  
  11361. .lf        dc.b    10,0
  11362.  
  11363. **************************************************************************
  11364.  
  11365.         include src/disassemble.s
  11366.         include src/assemble.s
  11367.  
  11368. ;make a copy of registers for disassemble function
  11369.  
  11370. init_regBMON    lea.l    regsBMON,a1
  11371.         lea.l    registres,a0
  11372.         moveq    #16-1,d0
  11373. .copy        move.l    (a0)+,(a1)+
  11374.         dbf    d0,.copy
  11375.         move.l    usp_reg,(a1)+
  11376.         move.l    isp_reg,(a1)+
  11377.         move.l    msp_reg,(a1)+
  11378.         move.l    vbr_reg,(a1)+
  11379.         move.l    cacr_reg,(a1)+
  11380.         move.l    caar_reg,(a1)+
  11381.         move.l    pc_reg,(a1)+
  11382.         moveq    #0,d0
  11383.         move.w    sr_reg,d0
  11384.         move.l    d0,(a1)+
  11385.         rts
  11386.  
  11387. ************************************************************
  11388.  
  11389.         include src/keymaps.s
  11390.  
  11391. ;----------------------------------------------------------------------------
  11392.  
  11393. ascII        dc.b "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz "
  11394.         dc.b "0123456789+",'"'
  11395.         dc.b "*ç%&/()=?'!$#-,;:[]<>@.éàèöäü",$5c,"|§°_¹²{} "
  11396. end_ascII
  11397.  
  11398. ;--- special ascII -------
  11399. ; '¹' = continous line
  11400. ; '²' = small dot
  11401.  
  11402. ;----------------------------------------------------------------------------
  11403.  
  11404. ascIIx        dcb.b $20,"²"
  11405.         dc.b ' !"£$%&',"'()*+,-./0123456789:;<=>?@"
  11406.         dc.b "ABCDEFGHIJKLMNOPQRSTUVWXYZ[",$5c,"]^_²"
  11407.         dc.b "abcdefghijklmnopqrstuvwxyz"
  11408.         dc.b "{|}²çüé²äà²ç²²è"
  11409.         dcb.b 256,"²"
  11410.         even
  11411.  
  11412. hex_list    dc.b "0123456789ABCDEF"
  11413.  
  11414.         cnop 0,4
  11415. ascII_conv    dcb.b 256,0
  11416.  
  11417.  
  11418. file_len_txt    dc.b "File length=$",0
  11419. BP_enter_txt    dc.b "Break Point reached at address $",0
  11420. BPJ_enter_txt    dc.b "JSR Break Point reached at address $",0
  11421. BP_set_txt    dc.b "Break Point set at address $",0
  11422. BPJ_set_txt    dc.b "JSR Break Point set at address $",0
  11423. BP_clr_txt    dc.b "Break Point removed at address $",0
  11424. all_break_txt    dc.b "Break Point at $",0
  11425. all_break2_txt    dc.b "JSR Break Point at $",0
  11426. all_BP_txt    dc.b "All Break Points cleared",$a,0
  11427. show_txt    dc.b "memory address : $",0
  11428. break_txt    dc.b "Break...",$a,0
  11429. drive_txt    dc.b "Active drive is now : ",0
  11430. no_disk_txt    dc.b "No disk in drive ...",$a,0
  11431. corrupt_txt    dc.b "Track corrupted ...",$a,0
  11432. bad_sum_txt    dc.b "Bad Block_Checksum ...",$a,0
  11433. NotDOS_txt    dc.b "Not a DOS disk ...",$a,0
  11434. WriteProt_txt    dc.b "Disk is write-protected ...",$a,0
  11435. Bitmap_txt    dc.b "Invalid Bitmap ...",$a,0
  11436.  
  11437. NotEmpty_txt        dc.b "Directory not empty ...",$a,0
  11438. IDEerr_txt        dc.b "IDE disk error ...",$a,0
  11439. NoFFS_txt        dc.b "Not an FFS or Int. FFS disk ...",$a
  11440.             dc.b "(OFS and DC-FFS not supported)",$a,0
  11441. IllegalPath_txt        dc.b "Illegal path ...",$a,0
  11442. DeviceNotFound_txt    dc.b "Device not found ...",$a,0
  11443. FileExists_txt        dc.b "File already exists ...",$a,0
  11444. DiskFull_txt        dc.b "Disk full ...",$a,0
  11445. FileNotFound_txt    dc.b "File not found ...",$a,0
  11446. CreateFile_txt        dc.b "Can't create file ...",$a,0
  11447.  
  11448.  
  11449. unknown_txt        dc.b "Unknown command...",$a,0
  11450. illegal_syntax_txt    dc.b "Illegal syntax...",$a,0
  11451. illegal_addr_txt    dc.b "Illegal address...",$a,0
  11452. illegal_reg_txt        dc.b "Illegal register...",$a,0
  11453. illegal_val_txt        dc.b "Illegal value...",$a,0
  11454. illegal_name_txt    dc.b "Illegal name...",$a,0
  11455. illegal_string_txt    dc.b "Illegal string...",$a,0
  11456. illegal_expr_txt    dc.b "Illegal expression...",$a,0
  11457. not_found_txt        dc.b "File not found...",$a,0
  11458. too_break_txt        dc.b "Too many break points...",$a,0
  11459. insert_off_txt        dc.b "off"
  11460. insert_on_txt        dc.b "on "
  11461.  
  11462. outerr_txt    dc.b "Wrong register number...",$a,0
  11463.  
  11464.         include src/help.s
  11465.  
  11466. ;--------------------------------------------------------------------
  11467.  
  11468. topaz2        incbin "topaz3.raw"
  11469.         ;880*10 Main Font
  11470.  
  11471.         cnop 0,4
  11472.  
  11473. ***********************************************************
  11474.  
  11475.  
  11476. ascII_mac    macro
  11477.         dcb.b 80*(MAX_SCREEN-3),' '        ;fill with spc.
  11478.         dc.b "¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹"
  11479.         dc.b "¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹"
  11480.         dc.b "HRTmon V"
  11481.         version
  11482.         dc.b " by Alain Malek                         "
  11483.         dc.b "                      "
  11484.  
  11485.         dc.b \1
  11486.         dc.b "Track:[00] Drive:[0] Address:[$00000000]"
  11487.         dc.b " Hrt:[$00000000] Fcpu:[65802]  Ins:[Off]"
  11488.  
  11489.  
  11490.         even
  11491.         endm
  11492.  
  11493. *****************************************************************************
  11494. ;----------------------------------------
  11495. ; names of exception/interrupt vectors
  11496. ; for using with _DoString
  11497.  
  11498. _exceptionnames
  11499. .exlist        dc.w    2        ;first
  11500.         dc.w    61        ;last
  11501.         dc.l    0        ;next list
  11502.         dc.w    .buserr-.exlist        ;#2
  11503.         dc.w    .adderr-.exlist
  11504.         dc.w    .illinst-.exlist
  11505.         dc.w    .div-.exlist
  11506.         dc.w    .chk-.exlist
  11507.         dc.w    .trapv-.exlist
  11508.         dc.w    .priv-.exlist
  11509.         dc.w    .trace-.exlist
  11510.         dc.w    .linea-.exlist        ;#10
  11511.         dc.w    .linef-.exlist        ;#11
  11512.         dc.w    .emu-.exlist
  11513.         dc.w    .co-.exlist        ;#13
  11514.         dc.w    .fmt-.exlist
  11515.         dc.w    .nii-.exlist
  11516.         dcb.w    8,0
  11517.         dc.w    .spi-.exlist        ;#24
  11518.         dc.w    .au1-.exlist
  11519.         dc.w    .au2-.exlist
  11520.         dc.w    .au3-.exlist
  11521.         dc.w    .au4-.exlist
  11522.         dc.w    .au5-.exlist
  11523.         dc.w    .au6-.exlist
  11524.         dc.w    .nmi-.exlist
  11525.         dc.w    .t0-.exlist        ;#32
  11526.         dc.w    .t1-.exlist
  11527.         dc.w    .t2-.exlist
  11528.         dc.w    .t3-.exlist
  11529.         dc.w    .t4-.exlist
  11530.         dc.w    .t5-.exlist
  11531.         dc.w    .t6-.exlist
  11532.         dc.w    .t7-.exlist
  11533.         dc.w    .t8-.exlist
  11534.         dc.w    .t9-.exlist
  11535.         dc.w    .t10-.exlist
  11536.         dc.w    .t11-.exlist
  11537.         dc.w    .t12-.exlist
  11538.         dc.w    .t13-.exlist
  11539.         dc.w    .t14-.exlist
  11540.         dc.w    .t15-.exlist
  11541.         dc.w    .fbra-.exlist
  11542.         dc.w    .fir-.exlist
  11543.         dc.w    .fdiv-.exlist
  11544.         dc.w    .fuf-.exlist
  11545.         dc.w    .foe-.exlist
  11546.         dc.w    .fof-.exlist
  11547.         dc.w    .fnan-.exlist
  11548.         dc.w    .fudt-.exlist
  11549.         dc.w    .mmucfg-.exlist
  11550.         dc.w    .51io-.exlist
  11551.         dc.w    .51alv-.exlist
  11552.         dc.w    0
  11553.         dc.w    .uea-.exlist        ;#60
  11554.         dc.w    .ui-.exlist        ;#61
  11555. .buserr        dc.b    "Access Fault",0
  11556. .adderr        dc.b    "Address Error",0
  11557. .illinst    dc.b    "Illegal Instruction",0
  11558. .div        dc.b    "Integer Divide by Zero",0
  11559. .chk        dc.b    "CHK,CHK2 Instruction",0
  11560. .trapv        dc.b    "TRAPV,TRAPcc,cpTRAPcc Instruction",0
  11561. .priv        dc.b    "Privilege Violation",0
  11562. .trace        dc.b    "Trace",0
  11563. .linea        dc.b    "Line 1010 Emulator",0
  11564. .linef        dc.b    "Line 1111 Emulator",0
  11565. .emu        dc.b    "Emulator Interrupt",0            ;68060
  11566. .co        dc.b    "Coprocessor Protocol Violation",0    ;68020/68030
  11567. .fmt        dc.b    "Stackframe Format Error",0
  11568. .nii        dc.b    "Uninitialized Interrupt",0
  11569. .spi        dc.b    "Spurious Interrupt",0
  11570. .au1        dc.b    "Level 1 Autovector (TBE/DSKBLK/SOFT)",0
  11571. .au2        dc.b    "Level 2 Autovector (CIA-A/EXT)",0
  11572. .au3        dc.b    "Level 3 Autovector (COPPER/VBLANK/BLITTER)",0
  11573. .au4        dc.b    "Level 4 Autovector (AUDIO0-3)",0
  11574. .au5        dc.b    "Level 5 Autovector (RBF/DSKSYNC)",0
  11575. .au6        dc.b    "Level 6 Autovector (CIA-B/EXT)",0
  11576. .nmi        dc.b    "NMI Autovector",0
  11577. .t0        dc.b    "TRAP #0",0
  11578. .t1        dc.b    "TRAP #1",0
  11579. .t2        dc.b    "TRAP #2",0
  11580. .t3        dc.b    "TRAP #3",0
  11581. .t4        dc.b    "TRAP #4",0
  11582. .t5        dc.b    "TRAP #5",0
  11583. .t6        dc.b    "TRAP #6",0
  11584. .t7        dc.b    "TRAP #7",0
  11585. .t8        dc.b    "TRAP #8",0
  11586. .t9        dc.b    "TRAP #9",0
  11587. .t10        dc.b    "TRAP #10",0
  11588. .t11        dc.b    "TRAP #11",0
  11589. .t12        dc.b    "TRAP #12",0
  11590. .t13        dc.b    "TRAP #13",0
  11591. .t14        dc.b    "TRAP #14",0
  11592. .t15        dc.b    "TRAP #15",0
  11593. .fbra        dc.b    "FP Branch or Set on Unordered Condition",0
  11594. .fir        dc.b    "FP Inexact Result",0
  11595. .fdiv        dc.b    "FP Divide by Zero",0
  11596. .fuf        dc.b    "FP Underflow",0
  11597. .foe        dc.b    "FP Operand Error",0
  11598. .fof        dc.b    "FP Overflow",0
  11599. .fnan        dc.b    "FP Signaling NAN",0
  11600. .fudt        dc.b    "FP Unimplemented Datatype",0        ;68040
  11601. .mmucfg        dc.b    "MMU Configuration Error",0        ;68030/68851
  11602. .51io        dc.b    "MMU Illegal Operation Error",0        ;68851
  11603. .51alv        dc.b    "MMU Access Level Violation Error",0    ;68851
  11604. .uea        dc.b    "Unimplemented Effective Address",0    ;68060
  11605. .ui        dc.b    "Unimplemented Integer Instruction",0    ;68060
  11606.  
  11607.         EVEN
  11608.  
  11609.  
  11610. *****************************************************************************
  11611. ;----------------------------------------
  11612. ; Berechnet String-Adresse über Zuordungstabelle
  11613. ; input :    D0 = WORD   value
  11614. ;        A0 = STRUCT Zuordnungstabelle
  11615. ; output :    D0 = CPTR   string or NULL
  11616.  
  11617. _DoStringNull
  11618. .start        cmp.w    (a0),d0            ;lower bound
  11619.         blt    .nextlist
  11620.         cmp.w    (2,a0),d0        ;upper bound
  11621.         bgt    .nextlist
  11622.         move.w    d0,d1
  11623.         sub.w    (a0),d1            ;index
  11624.         add.w    d1,d1            ;because words
  11625.         move.w    (8,a0,d1.w),d1        ;rptr
  11626.         beq    .nextlist
  11627.         add.w    d1,a0
  11628.         move.l    a0,d0
  11629.         rts
  11630.  
  11631. .nextlist    move.l    (4,a0),a0        ;next list
  11632.         move.l    a0,d1
  11633.         bne    .start
  11634.         
  11635.         moveq    #0,d0
  11636.         rts
  11637.  
  11638. ***********************************************************
  11639.  
  11640.         include src/format_block.s
  11641.         include src/custom_names.s
  11642.  
  11643. **************************************************************************
  11644. **************************************************************************
  11645. **************************************************************************
  11646.  
  11647.         cnop 0,16
  11648.  
  11649. inited        dc.l 0            ;<>$12345678 then never entered
  11650. registres    dcb.l 14,0        ;d0-d7,a0-a5
  11651. a6_reg        dc.l 0
  11652. a7_reg        dc.l 0
  11653. sr_reg        dc.w 0
  11654. pc_reg        dc.l 0
  11655. ssp_reg        dc.l 0
  11656. usp_reg        dc.l 0
  11657. vbr_reg        dc.l 0
  11658. cacr_reg    dc.l 0
  11659. caar_reg    dc.l 0        ; or BUSR on 68060
  11660. isp_reg        dc.l 0
  11661. msp_reg        dc.l 0        ; or PCR on 68060
  11662. tc_reg        dc.l 0
  11663. end_registres
  11664. itt0_reg    dc.l 0
  11665. itt1_reg    dc.l 0
  11666. dtt0_reg    dc.l 0
  11667. dtt1_reg    dc.l 0
  11668.  
  11669.         cnop 0,4
  11670.  
  11671. OldRaster    dc.l 0            ;old pos of raster beam
  11672.  
  11673. proc_type    dc.w 2            ;processor type 2=68020,...,6=68060
  11674.     ;keyboard ptr with/without SHIFT, ALT
  11675. board_ptr    dc.l board3,board4,board4a
  11676.  
  11677. ;-------------------------------------------
  11678.  
  11679. ascII_ptr    dc.l ascII_page1    ;ptr on actual ascII page
  11680.         dc.l ascII_page1    ;list of ptrs on all ascII pages
  11681.         dc.l ascII_page2
  11682.         dc.l ascII_Tracer
  11683.         dc.l 0            ;end signal for multi-print
  11684.  
  11685. Reset_Flag    dc.w 0            ;Copy of Action_GAL AND %100
  11686. trace_count    dc.w 0            ;nb of steps to trace
  11687. escape        dc.b 0            ;escape monitor signal
  11688. kill        dc.b 0            ;Kill cmd done
  11689. reboot        dc.b 0            ;Reboot cmd done
  11690. break_mode    dc.b 0            ;0=no break points -1 BP set
  11691. BP_reach    dc.b 0            ;entered from Illegal breakpoint
  11692. BPJ_reach    dc.b 0            ;entered from JSR breakpoint
  11693. BPatPC        dc.b 0            ;BP at PC -> need one trace step
  11694. trace_moni    dc.b 0            ;Tracer mode ON/OFF
  11695. cheat        dc.b 0            ;Can access Action-Replay area ?
  11696. cheat_cnt    dc.b 0            ;counter to enable cheat
  11697. pic_status    dc.b 0            ;0=low-mem ok. -1=pic in low-mem
  11698. VBL        dc.b 0            ;set to -1 at each VBL
  11699. packed        dc.b 0            ;used by LA_cmd
  11700. debug_entry    dc.b 0    ;1=bus,2=addr,3=illegal,4=zero,5=linea,6=linef
  11701.         cnop 0,4
  11702.  
  11703.  
  11704. ;-------------------------------------------
  11705.         cnop 0,4
  11706.  
  11707. last_cmd    dc.l cmd_list        ;keep last command
  11708. hex_ptr:    dc.l 0            ;ptr on last address shown as hexa
  11709. dis_ptr:    dc.l 0            ;ptr on last addr disassembled
  11710. asc_ptr        dc.l 0            ;same for ascII dump
  11711.  
  11712. time_repeat:    dc.w 0
  11713. time_cursor:    dc.w 0
  11714. cursor_x:    dc.w 0
  11715. cursor_y:    dc.w 0
  11716. old_cursor:    dc.l 0        ;cursor_xy backup for Tracer
  11717. print_cnt    dc.w 0        ;used in print procedure
  11718. ascII_num:    dcb.b 8,0
  11719. cursor_on:    dc.b 0        ;actual cursor state (displayed or not)
  11720. no_curs:    dc.b 0        ;disable cursor
  11721. key:        dc.b 0        ;actual key
  11722. key_prev:    dc.b $7f    ;previous key
  11723. shift_mode    dc.b 0        ;0=no shift key pressed
  11724. ctrl_mode    dc.b 0        ;0=no ctrl key pressed
  11725. alt_mode    dc.b 0        ;0=no alt key pressed
  11726. amiga_mode    dc.b 0        ;0=no amiga key pressed
  11727. insert_mode    dc.b 0        ;0=no insert -1=insert mode on
  11728. break        dc.b 0        ;break signal (ESC)
  11729. ascII_page    dc.b 0        ;0=page1, -1=page2
  11730.         even
  11731. nb_keys        dc.w 0
  11732. key_buffer    dcb.b 64,0
  11733. new_key        dc.b 0
  11734.         even
  11735.  
  11736. history_cnt    dc.w 0        ;last history
  11737. history_disp    dc.w 0        ;next displayed history
  11738. history        rept    16
  11739.         dcb.b 80,0
  11740.         endr        ;16 lines of history
  11741.  
  11742. command:    dcb.b 80+20,0        ;the actual command line is here
  11743.  
  11744. window_top    dc.w 0        ;top of actual window
  11745. window_bot    dc.w 0        ;bottom of actual window (last line)
  11746. screen_height    dc.w 22        ;nb max of lines (depending of resolution)
  11747.  
  11748.  
  11749. no_print    dc.b 0        ;if -1 then print won't write in the picture
  11750.                 ;memory, only in the ascII_page
  11751.  
  11752. disk_op        dc.b 0        ;-1 when a disk operation occures
  11753. floppy_op    dc.b 0        ;-1 when floppy operation occured (needs motor_off)
  11754. cmd_executed    dc.b 0        ;-1 when a command is executed
  11755. cmd_crashed    dc.b 0        ;-1 if command crashed
  11756.  
  11757.         cnop 0,4
  11758.  
  11759. ;-------------- strings which are modified ----------------
  11760. registre_txt
  11761. data0_reg    dc.b "D0=xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx "
  11762. data4_reg    dc.b "xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx",$a
  11763. addr0_reg    dc.b "A0=xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx "
  11764. addr4_reg    dc.b "xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx",$a
  11765. pc_txt        dc.b "PC=xxxxxxxx  "
  11766. ssp_txt        dc.b "SSP=xxxxxxxx "
  11767. usp_txt        dc.b "USP=xxxxxxxx "
  11768. vbr_txt        dc.b "VBR=xxxxxxxx "
  11769. sr_txt        dc.b "SR=xxxx "
  11770. rts_txt        dc.b "RTS=xxxxxxxx",$a
  11771. ISP_txt        dc.b "ISP=xxxxxxxx "
  11772. MSP_txt        dc.b "MSP=xxxxxxxx "
  11773. CACR_txt    dc.b "CACR=xxxxxxxx "
  11774. CAAR_txt    dc.b "CAAR=xxxxxxxx "
  11775. mc_txt        dc.b "MC68060",$a,0
  11776.  
  11777. hex_txt:
  11778.     dc.b "h $xxxxxxxx $xxxx $xxxx $xxxx $xxxx $xxxx $xxxx $xxxx $xxxx "
  11779. hex_txt2    dc.b "'                '",$a,0
  11780.  
  11781.         cnop 0,4
  11782. general_txt    dcb.b 80,0    ;can be used by anyone to output a line
  11783.         dc.b $a,0
  11784.         even
  11785.  
  11786. ev_line        dcb.b 80,0    ;evaluation output line (for any other use too)
  11787.         dc.b $a,0
  11788.  
  11789. ;-------------- Tracer variables ---------------------
  11790.         cnop 0,4
  11791. tracer_old_rts    dc.l 0        ;when skiping subroutine
  11792. tracer_addr    dcb.l MAX_SCREEN-10,-1    ;address disassembled on each line
  11793.                 ;of the tracer
  11794.  
  11795. actual_pos    dc.w -1,-1
  11796. tracer_refresh    dc.b 0
  11797. trace_bsr    dc.b 0
  11798.  
  11799. ;-------------- watch variables ----------------------
  11800. watch_txt    dcb.b 12," "
  11801.  
  11802. watch        dc.l 0            ;the thing to watch, ptr or val
  11803.  
  11804. ;-------------- output cmd variables -----------------
  11805.         cnop 0,4
  11806. output_start    dc.l 0
  11807. output_ptr    dc.l 0
  11808.  
  11809.         cnop 0,4
  11810.  
  11811. ;-------------- Q (cmp mem) cmd variables ------------
  11812.  
  11813. cmp_start    dc.l 0
  11814. cmp_end        dc.l 0
  11815. cmp_dest    dc.l 0
  11816.  
  11817. ;-------------- A (assemble) cmd variables -----------
  11818.  
  11819. ass_addr    dc.l 0        ;address parameter
  11820.  
  11821. ;-------------- AF cmd variables ---------------------
  11822.  
  11823. af_ptr        dc.l 0
  11824.  
  11825. ;-------------- O (fill mem) cmd variables -----------
  11826.  
  11827. fill_start    dc.l 0
  11828. fill_end    dc.l 0
  11829.  
  11830. ;-------------- E show custom registers --------------
  11831.  
  11832. custom_offset    dc.l 0
  11833.  
  11834. ;-------------- trainer variables --------------------
  11835.  
  11836. ts_size        dc.w -1            ;size used for searching .B .W .L
  11837.         cnop 0,4
  11838. ts_start    dc.l 0
  11839. ts_end        dc.l 0
  11840.  
  11841. tf_txt        dc.b "$xxxxxxxx ",0
  11842. ts_deep        dc.b 0            ;deep trainer mode on/off
  11843.         cnop 0,4
  11844.  
  11845. ;-------------- DEBUG cmd variables ------------------
  11846.         cnop 0,4
  11847.  
  11848. exc8        dc.l 0            ;backup of
  11849. excC        dc.l 0            ;exception
  11850. exc10        dc.l 0            ;vectors
  11851. exc14        dc.l 0            ;when
  11852. exc28        dc.l 0            ;in
  11853. exc2C        dc.l 0            ;debug mode
  11854.  
  11855. debug        dc.b 0            ;debug mode ON/OFF
  11856.  
  11857. ;-------------- F,FI,FIF cmds variable ---------------
  11858.         cnop 0,4
  11859.  
  11860. find_start    dc.l 0
  11861. find_end    dc.l 0
  11862. find_list    dcb.b 80,0
  11863.         dc.w 0
  11864.  
  11865.         cnop 0,4
  11866.  
  11867. ;-------------- RS,WS cmds variables -----------------
  11868.  
  11869. sec_addr    dc.l 0
  11870.  
  11871. strtsec        dc.w 0
  11872. nbsec        dc.w 0
  11873.  
  11874. rwsec        dc.b 0        ;'R' or 'W' (rs or ws cmd)
  11875.         cnop 0,4
  11876.  
  11877. ;-------------- T,TA (trace) cmds variable -----------
  11878.  
  11879. old_trace:    dc.l 0        ;old trace exception vector
  11880. trace_address:    dc.l -1        ;used by TA
  11881.  
  11882. ;-------------- C,CE (copy,exg mem) cmd variables ----
  11883.  
  11884. copy_start    dc.l 0
  11885. copy_end    dc.l 0
  11886. copy_dest    dc.l 0
  11887. exgc        dc.b 0            ;copy or exg ?
  11888.         cnop 0,4
  11889.  
  11890. ;-------------- variables used by read_number procedure ---
  11891.  
  11892. minus        dc.b 0
  11893. ok_numb        dc.b 0
  11894. label        dc.b 0            ;disable label recognition
  11895.         cnop 0,4
  11896.  
  11897. ;-------------- variables used for evaluation --------
  11898.  
  11899. exit_stack    dc.l 0            ;to restore stack after an error
  11900. muls_data    dc.l 0,0        ;used by muls32 procedure
  11901. divs_data    dc.l 0,0        ;used by divs32 procedure
  11902. eval_size    dc.w 0            ;size 0=.b 1=.w 3=.l
  11903.         cnop 0,4
  11904.  
  11905. ;-------------- 65816 CPU variables ------------------
  11906.  
  11907. fami_mode    dc.b 0        ;0=65802 -1=65816
  11908. fami_auto    dc.b 0        ;automatic switch on/off   0/-1
  11909.         cnop 0,4
  11910.  
  11911. ;-------------- breakpoint variables -----------------
  11912.  
  11913. illegal_except    dc.l 0        ;old illegal exception vector for BP
  11914. Break_Address    dc.l 0        ;keep address of BP when entering monitor
  11915. JB_save        dc.l 0,0    ;used by JSR_reach
  11916.  
  11917. break_list    rept 20            ;20 breakpoints max.
  11918.  
  11919.         dc.l 0            ;break address
  11920.         dc.w -1            ;old word
  11921.         dc.l -1            ;old address for jsr
  11922.         endr
  11923.  
  11924.         dc.l -1            ;end
  11925.         dc.w -1            ;
  11926.         dc.l -1            ;signals
  11927.         cnop 0,4
  11928.  
  11929. ;-------------- variable used by get_dkey procedure --
  11930.  
  11931. dkey        dc.b 0,0        ;direct key,olddkey
  11932. dkey_rep    dc.w 0            ;direct key,repeat
  11933. dkey_shift    dc.b 0            ;direct shift
  11934.         cnop 0,4
  11935.  
  11936. ;-------------- Floppy disk variables ----------------
  11937.  
  11938. old_head    dc.w 0,0,0,0        ;old pos of head (1 for each drive)
  11939.  
  11940. sectpos:    dc.w 0            ;nb sectors to read in access
  11941. startsec:    dc.w 0            ;offset of first sector in 1st track
  11942. oldsectpos:    dc.w 0
  11943. oldstartsec:    dc.w 0
  11944.  
  11945. drive_present    dc.b 0,0,0,0        ;floppy drive present
  11946.  
  11947. drive:        dc.w 3            ;selected floppy disk (3-6)
  11948. track:        dc.w 0,0,0,0        ;actual pos of head (1 for each drive)
  11949. OldAdk:        dc.w 0
  11950. writes:        dc.b 0            ;write floppy accesss ?
  11951. init:        dc.b 0            ;head pos initied ? (bits 3-6)
  11952. mot_on:        dc.b 0            ;motor on ? (bits 3-6)
  11953. ctrl:        dc.b 0            ;end access signal
  11954.  
  11955.         cnop 0,4
  11956.  
  11957. header:        dc.l $ff00000b        ;MFM header
  11958. format        dc.b 0
  11959. first_sauve    dc.b 0
  11960.         cnop 0,4
  11961.  
  11962. drive_err    dc.w 0
  11963.  
  11964.         cnop 0,4
  11965.  
  11966. buffer        dc.l 0            ;address of DMA disk buffer
  11967.  
  11968. ;-------------- IDE drive variables ------------------
  11969.  
  11970.         STRUCTURE IDE_info,0
  11971.         UWORD II_NbCyl
  11972.         UWORD II_NbHeads
  11973.         UWORD II_NbSecTrack
  11974.         UWORD II_MultSize        ;multiple block size
  11975.         LABEL II_SIZEOF
  11976.  
  11977. IDE_info0    dc.w 0        ;NbCyl
  11978.         dc.w 0        ;NbHeads
  11979.         dc.w 0        ;NbSecTrack
  11980.         dc.w 0        ;MultSize
  11981.  
  11982. IDE_info1    dc.w 0        ;NbCyl
  11983.         dc.w 0        ;NbHeads
  11984.         dc.w 0        ;NbSecTrack
  11985.         dc.w 0        ;MultSize
  11986.  
  11987.         even
  11988.  
  11989. ;-------------- part variables -----------------------
  11990.  
  11991.         cnop 0,4
  11992.  
  11993. floppy0:    dc.l 0
  11994.         dc.l 0
  11995.         dc.l 1760
  11996.         dc.l floppy_device
  11997.         dc.w 0            ;unit
  11998.         dc.b 0,0,0,0        ;for DOS\1,2,3,...
  11999.         dc.b 3,"DF0"
  12000.         dcb.b 32-4,0
  12001.         dcb.b 32,0
  12002. floppy1:    dc.l 0
  12003.         dc.l 0
  12004.         dc.l 1760
  12005.         dc.l floppy_device
  12006.         dc.w 1            ;unit
  12007.         dc.b 0,0,0,0        ;for DOS\1,2,3,...
  12008.         dc.b 3,"DF1"
  12009.         dcb.b 32-4,0
  12010.         dcb.b 32,0
  12011.  
  12012.         rept 16            ;16 harddisk partition max
  12013.         dc.l 0
  12014.         dc.l 0
  12015.         dc.l 0
  12016.         dc.l 0
  12017.         dc.w 0            ;unit
  12018.         dc.b 0,0,0,0        ;for DOS\1,2,3,...
  12019.         dcb.b 32,0
  12020.         dcb.b 32,0
  12021.         endr
  12022. harddisk_end
  12023.  
  12024.  
  12025. ;-------------- track buffer to speedup floppy access -----
  12026.  
  12027. track_buffer    dcb.b 512*11    ;track buffer (11 sectors)
  12028. track_buffer_no    dc.w -1        ;no of track in track_buffer (0-159)-1=empty
  12029. track_sector    dcb.b 12,-1    ;-1 if sector of track_buffer isn't loaded
  12030.                 ;(12 values instead of 11 for easier clear)
  12031. flush_needed    dc.b 0
  12032.         cnop 0,4
  12033.  
  12034.  
  12035. ;------------------------------------------------
  12036.  
  12037. ascII_page1    ascII_mac "Page_1"
  12038. ascII_page2    ascII_mac "Page_2"
  12039. ascII_Tracer    ascII_mac "Tracer"
  12040.  
  12041. ;------------------------------------------------
  12042.         cnop 0,4
  12043.  
  12044. custom        dcb.w $100,0        ;copy of custom $DFF000-$DFF1FE
  12045.  
  12046. CIAA        dcb.b 16,0
  12047. CIAB        dcb.b 16,0
  12048.  
  12049. palette
  12050. paletteH    dcb.w 8*32,0        ;High bits
  12051. paletteL    dcb.w 8*32,0        ;Low bits
  12052.  
  12053. ;------------------------------------------------
  12054.  
  12055. fbuf1        rept nb_fbuf
  12056.         dcb.b 512,0        ;file buffers
  12057.         endr
  12058.  
  12059. crash_stack    dcb.b $100,0
  12060.  
  12061. backup_vbr    dcb.b $400,0        ;backup of vector table (before HRTmon installation)
  12062.  
  12063. backup_pic    dcb.b PICSIZE,0        ;backup of pic mem
  12064. backup_dma    dcb.b $1a00*2,0        ;backup of floppy disk dma buffer
  12065.  
  12066. ;------------------------------------------------
  12067.         cnop 0,4
  12068.  
  12069. tmp_mem_size    equ $8000
  12070. tmp_mem        dcb.b tmp_mem_size,0
  12071.  
  12072. ;tmp_mem is used by:
  12073. ; - Trainer commands
  12074. ; - copy command (copy a file)
  12075. ; - d2f command (disk to file) (uses 512*11 first bytes)
  12076. ; - f2d command (file to disk) (uses 512*11 first bytes)
  12077. ; - sa command (save all)
  12078. ; - la command (load all)
  12079. ; - sp command (save picture)
  12080.  
  12081. ;(!Trainer buffer can be erased by one of these commands!)
  12082.  
  12083.         dcb.b $800,0    ;stack area
  12084. stack
  12085.  
  12086. end
  12087.  
  12088. ;--------------------------------------------------------------------
  12089.  
  12090. ;max floppy filesize=1730*512=885760
  12091.  
  12092.